-
Null
:只包含一个值:null
-
Undefined
:只包含一个值:undefined
-
Boolean
:包含true
和false
-
Number
:整数或浮点数,还有一些特殊值(-Infinity
、+Infinity
、NaN
)
-
String
:字符串
-
Symbol
:表示独一无二的值(ES6加入)
存放位置不同
- 存储的值大小不确定,可以动态调整
- 空间较大,运行效率低
- 无法直接操作其内部,使用引用地址读取
var a = 10;
var b = 'hello';
var c = true;
var a = 10;
var obj1 = { name: 'nihao' };
var obj2 = function () {
// do something
}
基本类型具有不可变性
var name = 'hello';
name.toUpperCase(); // "HELLO"
console.log(name); // "hello"
var c = true;
c = false;
console.log(c); // false
var obj1 = { name: 'nihao' };
obj1.name = 'nibuhao';
console.log(obj1); // { name: 'nibuhao' }
值比较和引用比较
var str1 = 'Hello';
var str2 = 'Hello';
console.log(str1 === str2); // true
var obj1 = { name: 'obj' };
var obj2 = { name: 'obj' };
console.log(obj1 === obj2); // false
赋值
var str1 = 'Hello';
var str2 = str1;
str2 = 'World';
console.log(str1); // "Hello"
//str1的值没变
var obj1 = { name: 'obj1' };
var obj2 = obj1;
obj2.name = 'obj2';
console.log(obj1.name); // "obj2"
// obj1的值改变
-
null
表示空值
-
undefined
表示“缺少值”,即此处应该有值,但是还未定义
var a = null;
console.log(typeof a); // object
console.log(typeof b); // undefined
var s = Symbol(); // 注意没有new
var name1 = Symbol('Tom');
var name2 = Symbol('Tom');
console.log(name1 === name2); // false
var name1 = Symbol.for('Tom');
var name2 = Symbol.for('Tom');
console.log(name1 === name2); // true
var obj = {
[Symbol('name')]: 'Tom'
};
var obj = {
[Symbol('name')]: 'Tom'
};
for (var key in obj) {
console.log(key); // undefined
}
Object.getOwnPropertySymbols(obj); // [Symbol(name)]
宽松等号(==)的隐式转换
NaN
NaN == NaN // false
Boolean类型与其他类型进行比较
false == 0 // true
true == 1 // true
true == 2 // false
var x = 10;
if (x) {
// ...
}
if (x == true) {
// ...
}
Number类型和String类型进行比较
'' == 0 // true
'123' == 123 // true
'1e11' == 1e11 // true
Infinity == 'Infinity' // true
true == '1' // true
false == '0' // true
null与undefined
基本类型与引用类型比较
- 当引用类型需要被转为基本类型时,它会先查找对象的
valueOf
方法,如果该方法返回基本类型的值,则ToPrimitive
的结果就是这个值
- 如果
valueOf
不存在或者valueOf
方法返回的不是基本类型,就会尝试调用对象的toString
方法,然后使用toString
的返回值作为ToPrimitive
的结果
- 若
valueOf
和toString
都不存在,或者没有返回基本类型,则抛出TypeError
异常
Number([]); // 0
Number([10]); // 10
var obj = {
valueOf: () => { return 10; },toString: () => { return -10; }
};
Number(obj); // 10
String(obj); // -10
var a = {};
var b = [1,2,3];
a == '[object Object]'; // true
a.toString(); // [object Object]
b == '1,3' // true
b.toString(); // "1,3"
typeof
typeof 'str'; // string
typeof 123; // number
typeof true; // boolean
typeof Symbol(); // symbol
typeof undefined; // undefined
typeof function () {} // function
instanceof
[] instanceof Array; // true
/1/ instanceof RegExp; // true
new Date() instanceof Date; // true
null instanceof null; // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
null instanceof Object; // false
Object.prototype.toString.call()
Object.prototype.toString.call(null); // [object Null]
Object.prototype.toString.call(undefined); // [object Undefined]
Object.prototype.toString.call(123); // [object Number]
Object.prototype.toString.call(new Date()); // [object Date]
// ...
function Person() {}
Object.prototype.toString.call(new Person()); // [object Object]
new Person() instanceof Person; // true