专栏首页code秘密花园JS中的变量和类型计算

JS中的变量和类型计算

题目

1.JS使用typeof能得到哪些类型

2.=== 和 == 的选择

3.JS中有哪些内置函数

4.JS变量按存储方式分为哪些类型,并描述其特点

5.如何理解JSON

值类型和引用类型

值类型(boolean,string,number,null,undefined)

var a = 10;var b = a;a = 20;

console.log(b); //10

引用类型(对象,数组,函数)

var a = {x:10}var b = a;
a.x = 20;
console.log(b); //20

值类型直接把值存储在堆中,把a赋值给b在内存中是又给b开辟了一块新的空间,存储了同样的值。

引用类型分两块存储,先在堆中存储一个实际的值,再在栈中存储一个堆中值的引用地址,指向堆中的对象。把a赋值给b是在栈中重新开辟一块空间存储的还是相同对象的引用地址,a和b存储的地址相同,指向的对象也相同。当对象值发生改变时,两者会同时改变。

引用类型的值一般都比较大,采用此种存储方式可以节省内存空间。

typeof运算符

typeof 'abc' //string

typeof 123 //number

typeof true //boolean

typeof undefined //undefined

typeof null //object

typeof {a:10} //object

typeof [1,2,3] //object

typeof console.log() //function

类型转换

强类型转换:通过String(),Number(),Boolean(),parseInt()函数强制转换

可能发生隐式类型转换的场景

  • 字符串拼接
  • 使用==
  • if语句
  • 逻辑循环

一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。

二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)

三、接着看双等号前后有没有字符串, 有三种情况:

1、对方是对象,对象使用toString()或者valueOf()进行转换; 2、对方是数字,字符串转数字;(前面已经举例) 3、对方是字符串,直接比较; 4、其他返回false 四、如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false

五、null, undefined不会进行类型转换, 但它们俩相等

上面的转换顺序一定要牢记,面试的时候,经常会出现类型的问题。

'100'==100  //转换成字符串

''==0  //转换成false

undefined == null; // true

1 == true; // true

2 == true; // false

0 == false; // true

0 == ' '; // true

NaN == NaN; // false

[] == false; // true

[] == ![]; // true
//在if中转换成false的:nullundefined''NaN0false
10 && 0  //0  10转换成true'' || 'abc' //abc   ''转换成false!window.abc  //true    

null和undefined的区别

null:是被赋值过的对象,刻意把一个对象赋值为null,故意表示其为空,不应有值,所以对象为null是正常的,typeof null 返回 'object' ,null可以转换为0

undefined 表示“缺少值”,即此处应有一个值,但还没有定义;转为数值时为NaN(非数字值的特殊值) typeof undefined 返回 'undefined'

题目解答

JS使用typeof能得到哪些类型

typeof 'abc' //string

typeof 123 //number

typeof true //boolean

typeof undefined //undefined

typeof null //object

typeof {a:10} //object

typeof [1,2,3] //object

typeof console.log() //function

=== 和 == 的选择

jquery源码中的写法:

除了以下方式其他全部使用 ===

if(obj.a == null){   //相当于 obj.a === undefined || obj.a === null}

JS中有哪些内置函数

单纯作为语言来说,不考虑node和浏览器web

  • Object
  • Array
  • Boolean
  • Number
  • String
  • Function
  • Date
  • RegExp
  • Error

内置对象:Math,JSON

JS变量按存储方式分为哪些类型,并描述其特点

值类型何引用类型

如何理解JSON

JSON是JS中的一个内置对象

区别

  • JS对象 {x:10}
  • JSON对象 {'x':10}
  • JSON串 "{'x':10}"

//将JS对象转换成json串JSON.stringify({x:10});

//将json字符串转换成json对象JSON.parse("{'x':10}");

严格模式

目的

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;   消除代码运行的一些不安全之处,保证代码运行的安全;

提高编译器效率,增加运行速度;

为未来新版本的Javascript做好铺垫。

特性

  "use strict";

可以选择放在一个函数中或自定义作用域中。

禁止this指向全局对象

function f(){    return !this;  } // 返回false,因为"this"指向全局对象,"!this"就是false  function f(){     "use strict";    return !this;  } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

创设eval作用域

正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。 正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。

  "use strict";
  var x = 2;
  console.info(eval("var x = 5; x")); // 5

  console.info(x); // 2

全局变量显式声明

 v = 1; // 报错,v未声明  
  
for(i = 0; i < 2; i++) { // 报错,i未声明  }

禁止删除变量

严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。

  "use strict";  var x;  delete x; // 语法错误

  var o = Object.create(null, {'x': {
      value: 1,
      configurable: true

  }});
  delete o.x; // 删除成功

函数不能有重名的参数

保留字

为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。 使用这些词作为变量名将会报错。

  function package(protected) {
 // 语法错误    "use strict";
     var implements; // 语法错误
  }

3.7 eval

1.没有必须使用的应用场景

2.不容易调试,可读性不好

3.在旧的浏览器中如果你使用了eval,性能会下降10倍。

4.容易xss

本文分享自微信公众号 - code秘密花园(code_mmhy),作者:ConardLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ES10新特性(一)

    BigInt 是一个任意精度的整数。这意味着变量现在可以 表示²⁵³ 数字,而不仅仅是9007199254740992。

    ConardLi
  • Chrome控制台骚操作,知道这些事半功倍

    Chrome 浏览器想必是每个前端工程师必备的利器之一,速度快、体积小、支持的特性也比其他浏览器多;除此之外,它还拥有强大的控制台功能,但很多开发者并没有用出控...

    ConardLi
  • 【技术圈】Flutter 1.12、Firefox 71、V8 8.0 一大把新特性来袭

    Flutter 1.12 是 1.9.x 的版本在经历 6 次 hotfix 之后,才带来的 stable 大版本更新。该版本解决了 4571 个报错,合并了 ...

    ConardLi
  • 实战:在小程序中获取用户所在城市信息

    最近在做自己的小程序《看啥好呢》,这个小程序是使用云开发的方式开发的,功能特别简单,就是获取豆瓣、大麦网的数据展示,虽然功能简单,但还是记录下开发过程和一些技术...

    Dunizb
  • 26种对付反调试的方法

    本文针对的是Windows操作系统中常用的防破0解及防逆向工程保护技术,即反调试方法,各种防逆向工程技术的主要目标是尽可能多的使逆变工具尽可能失效。

    战神伽罗
  • spring环境搭建

    东营浪人
  • java之spring mvc之Controller配置的几种方式

    Vincent-yuan
  • 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(1)表结构

    无限分类是一个老生常谈的话题了,网上有很多解决方案,可以分成二个流派,一种利用递归,一种利用非递归(当然需要其它一些辅助手段判断节点层次),但核心表结构都差不多...

    菩提树下的杨过
  • Java消息队列-Spring整合ActiveMq

    1、概述 ----   首先和大家一起回顾一下Java 消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了: 消息服务:一个中间件,用于...

    九灵
  • 一道SQL题的多种解法

    自然的想法,寻找每个店铺是否连续三天都有销售额。利用现有的表,构造一个中间表,中间表既有当前日期的销售额,又有当前日期后两天的销售额,然后筛选销售额大于0的店铺...

    数据森麟

扫码关注云+社区

领取腾讯云代金券