基本类型
JavaScript 中基本数据类型
本部分主要是针对于Object
Array
Date
String
Number
Boolean
这几个数据类型。
- Six data types that are primitives:BooleanNullUndefinedNumberStringSymbol (new in ECMAScript 6)
- and Object
typeof Object === "function"
typeof {} ==== "object"
typeof Boolean === "function"
const boolean = new Boolean()
typeof boolean === "object"
typeof undefined ==== 'undefined'
typeof null ==== 'object'
- 原始数据类型
(Primitive Type ) :Undefined、Null、Boolean、Number、String - 引用类型
(Reference Type ) :Object、Array、Function、Date
我们在声明变量时会有不同的内存分配:
- 原始值:存储在栈
(stack ) 中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。 - 引用值:存储在堆
(heap ) 中的对象,也就是说,存储在变量处的值是一个指针(point ) ,指向存储对象的内存地址。这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
不同的内存分配机制也带来了不同的访问机制在
数值类型
科学计算
取整
- round,四舍五入取与最接近的整数
floor, 对一个数进行下舍入,执行向下取整计算,返回小于或等于函数调用参数的并且与之最接近的值。ceil, 对一个数进行上舍入,执行的是向上取整计算,返回大于或者等于函数参数,并且与之最接近的整数。
幂
console.log(Math.pow(2, 10)); //1024
console.log(Math.pow(99, 9999)); //Infinity
console.log(Math.pow(1024, 0.1)); //2
console.log(Math.pow(0, 0)); //1
console.log(Math.pow(0, 1)); //0
console.log(Math.pow(2, -3)); //0.125
console.log(Math.pow(-2, 3)); //-8
随机数
<script type="text/javascript">
document.write(Math.random());
</script>
类型转换
parseInt & parseFloat
console.log(parseInt("1245red")); //1245
console.log(parseFloat("1245red")); //1245
console.log(parseInt("1245.5red")); //1245
console.log(parseFloat("1245.555red")); //1245.555
console.log(parseInt("red")); //NaN
console.log(parseInt("0xA")); //10
console.log(parseInt("AF", 16)); //175 10*16+15
console.log(parseInt("10", 2)); //2
console.log(parseInt("10", 8)); //8
console.log(parseInt("10", 10)); //10
//如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值
console.log(parseInt("010"));
console.log(parseInt("010", 8)); //8
console.log(parseInt("010", 10)); //10
console.log(parseFloat("1234red")); //1234
console.log(parseFloat("0xA")); //0
console.log(parseFloat("22.5")); //22.5
console.log(parseFloat("22.35.5")); //22.35
console.log(parseFloat("0908")); //908
console.log(parseFloat("blue")); //NaN
Number
使用
- 数值:转换后还是原来的值。
- 字符串:如果可以被解析为数值,则转换为相应的数值,否则得到
NaN 。空字符串转为0 。 - 布尔值:
true 转成1 ,false 转成0 。 - undefined:转成
NaN 。 - null:转成
0 。
parseInt("011"); // 9
parseInt("42 cats"); // 42
parseInt("0xcafebabe"); // 3405691582
Number("011"); // 11
Number("42 cats"); // NaN
Number("0xcafebabe"); // 3405691582
如果
- 先调用对象自身的
valueOf 方法,如果该方法返回原始类型的值( 数值、字符串和布尔值) ,则直接对该值使用Number 方法,不再进行后续步骤。 - 如果
valueOf 方法返回复合类型的值,再调用对象自身的toString 方法,如果toString 方法返回原始类型的值,则对该值使用Number 方法,不再进行后续步骤。 - 如果
toString 方法返回的是复合类型的值,则报错。
//Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。
console.log(Number(false)); //0
console.log(Number(true)); //1
console.log(Number(undefined)); //NaN
console.log(Number(null)); //0
console.log(Number("5.5")); //5.5
console.log(Number("5.6.7")); //NaN
console.log(Number("5red")); //NaN
console.log(Number(new Object())); //NaN
console.log(Number(100)); //100
console.log(Number(a)); //NaN
JavaScript 弱类型转换
const str="012.345";
const x = str-1;
console.log(x); //11.345
const str2 = "012.3456red";
const x = str2-2;
console.log(x); //NaN
格式化显示
这里用的是numeraljs,格式化显示的效果如下所示:
- Number
Number | Format | String |
---|---|---|
10000 | ‘0,0.0000’ | 10,000.0000 |
10000.23 | ‘0,0’ | 10,000 |
10000.23 | ‘+0,0’ | +10,000 |
- Currency
Number | Format | String |
---|---|---|
1000.234 | ‘$0,0.00’ | $1,000.23 |
1000.2 | ‘0,0[.]00 $’ | 1,000.20 $ |
- Bytes
Number | Format | String |
---|---|---|
100 | ‘0b’ | 100B |
2048 | ‘0 b’ | 2 KB |
- Percentages
Number | Format | String |
---|---|---|
1 | ‘0%’ | 100% |
0.974878234 | ‘0.000%’ | 97.488% |
- Time
Number | Format | String |
---|---|---|
25 | ‘00:00:00’ | 0:00:25 |
238 | ‘00:00:00’ | 0:03:58 |
布尔类型
布尔值代表 “ 真 ” 和 “ 假 ” 两个状态
- undefined
- null
- false
- 0
- NaN
"" ( 空字符串)
类型转换
所有对象的布尔值都是
Boolean(new Boolean(false))
// true
空类型
typeof undefined === ‘undefined’
而 typeof null === ‘object’
。
- 作为函数的参数,表示该函数的参数是对象。
- 作为对象原型链的终点。
- 变量被声明了,但没有赋值时,就等于
undefined 。 - 调用函数时,应该提供的参数没有提供,该参数等于
undefined 。 - 对象没有赋值的属性,该属性的值为
undefined 。 - 函数没有返回值时,默认返回
undefined 。
Symbols
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");
如上的代码会创建三个新的符号,注意,虽然
Symbol("foo") === Symbol("foo"); // false
确切地说,
另一方面,每一个
关于
> const sym = Symbol("<3");
> "your symbol is " + sym
// TypeError: can't convert symbol to string
> `your symbol is ${sym}`
// TypeError: can't convert symbol to string
有三种获取
** 调用Symbol() 。** 正如我们上文中所讨论的,这种方式每次调用都会返回一个新的唯一symbol 。** 调用Symbol.for(string) 。** 这种方式会访问symbol 注册表,其中存储了已经存在的一系列symbol 。这种方式与通过Symbol()
定义的独立symbol 不同,symbol 注册表中的symbol 是共享的。如果你连续三十次调用Symbol.for("cat")
,每次都会返回相同的symbol 。注册表非常有用,在多个web 页面或同一个web 页面的多个模块中经常需要共享一个symbol 。** 使用标准定义的symbol ,例如:Symbol.iterator。** 标准根据一些特殊用途定义了少许的几个symbol 。
Symbol
const obj = Object.create(null);
obj[Symbol.toPrimitive] = function (hint) {
console.log(hint);
return "";
};
console.log(String(obj));
console.log(obj + "");
console.log(+obj);
const smb =Symbol('hello');
console.log(smb);
console.log(''+smb);
console.log(1+smb);
console.log(String(smb));
// Uncaught TypeError: Cannot convert a Symbol value to a string