值类型(boolean,string,number,null,undefined)node
var a = 10; var b = a; a = 20; console.log(b); //10
引用类型(对象,数组,函数)jquery
var a = {x:10} var b = a; a.x = 20; console.log(b); //20
值类型直接把值存储在堆中,把a赋值给b在内存中是又给b开辟了一块新的空间,存储了一样的值。web
引用类型分两块存储,先在堆中存储一个实际的值,再在栈中存储一个堆中值的引用地址,指向堆中的对象。把a赋值给b是在栈中从新开辟一块空间存储的仍是相同对象的引用地址,a和b存储的地址相同,指向的对象也相同。当对象值发生改变时,二者会同时改变。面试
引用类型的值通常都比较大,采用此种存储方式能够节省内存空间。json
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()函数强制转换数组
可能发生隐式类型转换的场景浏览器
1、首先看双等号先后有没有NaN,若是存在NaN,一概返回false。安全
2、再看双等号先后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)xss
3、接着看双等号先后有没有字符串, 有三种状况:函数
一、对方是对象,对象使用toString()或者valueOf()进行转换;
二、对方是数字,字符串转数字;(前面已经举例)
三、对方是字符串,直接比较;
四、其余返回false
4、若是是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其余一概返回false
5、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的: null undefined '' NaN 0 false
10 && 0 //0 10转换成true '' || 'abc' //abc ''转换成false !window.abc //true
null:是被赋值过的对象,刻意把一个对象赋值为null,故意表示其为空,不该有值,因此对象为null是正常的,typeof null 返回 'object' ,null能够转换为0
undefined 表示“缺乏值”,即此处应有一个值,但尚未定义;转为数值时为NaN(非数字值的特殊值) typeof undefined 返回 'undefined'
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 }
单纯做为语言来讲,不考虑node和浏览器web
内置对象:Math,JSON
值类型何引用类型
JSON是JS中的一个内置对象
区别
//将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; // 语法错误 }
1.没有必须使用的应用场景
2.不容易调试,可读性很差
3.在旧的浏览器中若是你使用了eval,性能会降低10倍。
4.容易xss