说明
重学前端是程劭非(winter)在极客时间开的一个专栏,在此主要整理我的学习笔记。如有侵权,请联系我,谢谢。
七种语言类型
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
Undefined、Null
undefined表示未定义,只有一个值,就是undefined。任何变量在赋值前都是undefined类型。在js里是个变量,但不是关键字,为了防止被重写,在js里用void 0来获取undefined值。一般不会把变量赋值为undefined,这样可以保证所有值为undefined的变量都是未赋值的状态
undefined === void 0;//true
null表示定义了但是为空,在js里是关键字,也只有一个值,null。
Boolean
有两个值,true和false,true和false是js关键字。
String
String用于表示文本数据,它的意义不是“字符串”,而是字符串的UTF16编码,string的长度是受字符串编码的长度影响。最长2^53-1。
Number
例外情况
- NaN
- Infinity
- -Infinity
区别+0和-0的方法,检测1/x是infinity还是-infinity
非整数的Number类型无法用==(或===)来计较,这是浮点数的精度问题
0.1+0.2 == 0.3 //false
使用 JavaScript 提供的最小精度值来比较浮点数
Math.abs(0.1+0.2-0.3)<=Number.EPSILON //true
检测左右两边差的绝对值是不是小于最小精度
Symbol
ES6引入的新类型,表示独一无二的值。
用Symbol()函数创建symbol。 symbol函数的参数的作用是描述,为了输出的时候区分是哪一个值,因此相同参数的symbol函数返回的symbol值是不一样的。
var a = Symbol('a')
var b = Symbol('a')
console.log(a == b) //false
复制代码
Object
为什么给对象添加的方法可以用在基本类型上?
.
运算符提供了一个装箱操作,它会根据基本类型构造一个临时对象,使得它可以调用对应的对象方法
在js中,对象是“属性的集合”,属性分为数据属性和访问器属性,两者的结构都是key-value,key可以是字符串或者symbol类型。
js中的几个基本类型,在对象类型都有一个“亲戚”,它们是:
- Number
- String
- Boolean
- Symbol
Number、String、Boolean三个构造器是两用的,当用new搭配时,它们产生对象,当直接用时,表示强制类型转换。symbol构造器不能用new调用。
var a = Boolean(1)
var b = new Boolean(1)
console.log(typeof a) //boolean, a是true
console.log(typeof b) //object,b是true
复制代码
日常代码可以把用在对象的方法用在基本类型上
console.log('abc'.charAt(0)) // a
//charAt(index),index是字符串的下标,返回在该下标的字符,超出下标值的话返回空字符串
复制代码
在原型上添加方法,也可以应用于基本类型上
String.prototype.hello = () => console.log('hello')
var str = String('abc');
console.log(typeof str) // string
str.hello() // hello
复制代码
类型转换
js是弱类型语言,所有常常会发生类型转换。 == 和加减乘除大于小于,都会发生类型转换
StringToNumber
支持十进制、八进制、十六进制的转换。
- 30;
- 0b111;
- 0o13;
- 0xFF
还有科学计数法和正负号
- 1e3;
- -1e-2。
parseInt 和 parseFloat 并不使用这个转换,支持的语法和这里不尽相同。在不传入第二个参数的情况下,parseInt只支持16进制前缀‘0x’,而且会忽略非数字字符,就是不支持科学计数法。parseFloat是直接当十进制来转换。
多数情况下,用Number比parseInt和parseFloat好。
NumberToString
数字转字符串是按十进制,当number太多或太小时,会用科学计数法表示
装箱转换
string、boolean、number、symbol在对象中都有对应的类,装箱转换就是把基本类型转换成对应的对象。
symbol无法用new调用,但是可以用call方法来强迫产生装箱。
定义一个函数,函数只有return this,然后用call方法到一个symbol类型的值上,就会产生一个SymbolObject。
var symbolObject = (function(){ return this; }).call(Symbol("a"));
console.log(typeof symbolObject); //object
console.log(symbolObject instanceof Symbol); //true
console.log(symbolObject.constructor == Symbol); //true
复制代码
使用内置的Object函数,可以在js代码中显示调用装箱能力。
var symbolObject = Object(Symbol('a'));
console.log(typeof symbolObject) // object
console.log(symbolObject instanceof Symbol) // true
console.log(symbolObject.constructor === Symbol) // true
复制代码
拆箱转换
就是把对象类型转换成基本类型。
拆箱转换会尝试调用valueOf和toString,如果这两个方法都不存在,或者没有返回基本类型,会返回类型错误TypeError
转载于:https://juejin.im/post/5d0481f7e51d455a694f9515