一种既非对象也无方法的数据(MDN),它们的值直接存储在变量访问的位置(栈储存),所以一个原始值只能对应一个变量
- string 字符串
- number 数字
- boolean 布尔值
- undefined 未定义
- null 空
- symbol 唯一符号值
一种 object 类型并且可以有自己的方法(而且继承Object的原型方法),引用值允许多个变量访问,所以一个引用值可以对应多个变量(堆储存),反之,一个变量改变这个引用值,可能会引发其他变量改变(因为都是同一个内存地址)
- Object 对象
console.log(typeof'123')// => 'string'console.log(typeof123)// => 'number'console.log(typeoftrue)// => 'boolean'console.log(typeofundefined)// => 'undefined'console.log(typeof{})// => 'object' 引用类型console.log(typeoffunction(){})// => 'function' 引用类型(特殊)console.log(typeofSymbol(''))// => 'symbol'//奇怪结果// null 值会返回 "Object", null代表空对象指针,所以typeof判断成一个对象。可以说JS设计上的一个BUGconsole.log(typeofnull)// 'object'- undefined和null与任何有意义的值比较返回的都是false, 相反他们之间包括自身比较结果都为true
- NaN与所有值都不相等,包括自身
- 所有相同类型的数据比较,都不会发生隐式转换
- String与Boolean的值参与比较,String与Boolean的值都会隐式转换成数字,再比较 如: '1' == 1 和 '1' == true
- object值参与比较时(非对象与对象比较),该尝试调用.toString() 和 .valueOf() 方法,将参数 A 转换为原始值(Primitive),再比较
- 对象与对象比较时,结果与===的结果一样,内存地址不一样的对象不相等
- +0 == -0 结果为true
- undefined和null与任何有意义的值比较返回的都是false, 相反他们之间包括自身比较结果都为true
- 只要是类型不相同,都判断为不相等
- NaN与所有值都不相等,包括自身
- +0 == -0 结果为true
- 只要是类型不相同,都判断为不相等
- NaN与所有值都不相等,但 Object.is(NaN,NaN) 为true
- +0 == -0 结果为false
- 字符串运算 100 + '1'
- ==运算符(非null/undefined) ==号两边都会发生隐式转换 例如 100 == '100', [] == true
- if运算符 if(a){}
- 逻辑运算符 10 && 0
- 取反 !1
/* instanceof 是用来判断new XXX出来的非字面量数值 */typeofvalue==='string'||valueinstanceofString// 前者结果=> "string"typeofvalue==='number'||valueinstanceofNumber// 前者结果=> "number"typeofvalue==='boolean'||valueinstanceofBoolean// 前者结果=> "boolean"typeofvalue==='undefined'//=> "undefined"typeofvalue==='symbol'//=> "symbol"// 由于console.log(typeofnull);//=> "object"// 所以只能用value===null//或 value==null// Function实际属于object(引用类型),但是可以使用typefo判断typeofvalue==='function'// 利用constructor判断该对象的构造函数是否为对象构造函数本身(前提类有定义构造函数)value.constructor===ObjectArray.isArray(value)// 或Object.prototype.toString.call(value)==='[object Array]'