JS为了使得原始值和对象也产生联系,和其他面向对象的编程语言一样,实现了原始值对应的包装类型。
- JS原始值:
Number
Boolean
String
Symbol
Undefined
Null
1. Number类型
数值对象只有两个属性:
__proto__ 属性指向其原型对象、 [[PrimitiveValue]] 保存原始值。
对象原型上:
> let n = new Number(1);
// 构造函数
> n.__proto__.constructor;
ƒ Number() { [native code] }
// toExponential(fractionDigits) 转为指数形式 返回字符串
> 1.12345.toExponential(); // "1.12345e+0" 转为指数形式
> 1.12345.toExponential(3); // "1.123e+0" 可指定小数位数
> 12345.toExponential(); // Uncaught SyntaxError: Invalid or unexpected token
> 12345..toExponential(); // "1.2345e+4" 可用..调用该方法
> 12345 .toExponential(); // "1.2345e+4" 前面空格也行
// toFixed(digits) 格式化小数 返回字符串
> 12345 .toFixed(2); // "12345.00" 格式化小数位数
> 12345..toFixed(2); // "12345.00" 同理
> 1.2345.toFixed(3); // "1.234"
> 12345.toFixed(2); // Uncaught SyntaxError: Invalid or unexpected token
// toPrecision(precision) 指定有效位数
> 12345..toPrecision(); // "12345"
> 12345..toPrecision(3); // "1.23e+4"
> 1.2345.toPrecision(3); // "1.23"
// 字符串表示和值的方法
> 12345..toString(); // "12345"
> 12345..toLocaleString(); // "12,345"
> 12345..valueOf(); // 12345
对象原型性的构造函数上:
// 属性:
// 可表示的最小误差
> Number.EPSILON; // 2.220446049250313e-16
// 可表示的最大值
> Number.MAX_VALUE; // 1.7976931348623157e+308
// 可表示的最小值
> Number.MIN_VALUE; // 5e-324
// 最大的安全整数
> Number.MAX_SAFE_INTEGER; // 9007199254740991
// 最小的安全整数
> Number.MIN_SAFE_INTEGER; // -9007199254740991
// 正无穷大
> Number.POSITIVE_INFINITY; // Infinity
// 负无穷大
> Number.NEGATIVE_INFINITY; // -Infinity
// 非数值
> Number.NaN; // NaN
// 方法:
// 判断是否有限
> Number.isFinite(Infinity);// false
> Number.isFinite(1); // true
// 判断是否为整数
> Number.isInteger(12345); // true
> Number.isInteger(1.2345); // false
// 判断是否为NaN
> Number.isNaN(NaN); // true
> Number.isNaN(null); // false
// 判断是否为安全整数
> Number.isSafeInteger(Infinity); //false
> Number.isSafeInteger(12345); // true
// 数值解析
> Number.parseInt("1.2345"); // 1
> Number.parseFloat("1.2345"); // 1.2345
2. 布尔类型:
布尔对象也只有两个属性:
__proto__ 属性指向其原型对象、 [[PrimitiveValue]] 保存原始值。
对象原型上:
// 对象原型的构造函数
> console.dir(false.__proto__.constructor); // ƒ Boolean()
// 布尔对象的字符串表示
> false.__proto__.toString(); // "false"
// 布尔对象的值:
> false.__proto__.valueOf(); // false
3. String类型
参考博文:https://blog.csdn.net/qq_45668041/article/details/115742729
4. Symbol类型
- 注意:
不可用new创建Symbol对象! - 但可通过 Object() 方法创建!
> new Symbol("foo"); // Uncaught TypeError: Symbol is not a constructor
> let symObj = Object(Symbol("foo"));
> typeof symObj; // "object"
> typeof Symbol("sym"); // "symbol"
对象原型上:
constructor: ƒ Symbol()
description: (...)
toString: ƒ toString()
valueOf: ƒ valueOf()
Symbol(Symbol.toPrimitive): ƒ [Symbol.toPrimitive]()
Symbol(Symbol.toStringTag): "Symbol"
get description: ƒ description()
__proto__: Object
对象原型的构造函数上:
asyncIterator: Symbol(Symbol.asyncIterator)
caller: (...)
for: ƒ for()
hasInstance: Symbol(Symbol.hasInstance)
isConcatSpreadable: Symbol(Symbol.isConcatSpreadable)
iterator: Symbol(Symbol.iterator)
keyFor: ƒ keyFor()
length: 0
match: Symbol(Symbol.match)
matchAll: Symbol(Symbol.matchAll)
name: "Symbol"
prototype: Symbol {Symbol(Symbol.toStringTag): "Symbol", constructor: ƒ, toString: ƒ, valueOf: ƒ, …}
replace: Symbol(Symbol.replace)
search: Symbol(Symbol.search)
species: Symbol(Symbol.species)
split: Symbol(Symbol.split)
toPrimitive: Symbol(Symbol.toPrimitive)
toStringTag: Symbol(Symbol.toStringTag)
unscopables: Symbol(Symbol.unscopables)