重学前端-学习笔记-JavaScript类型

说明

重学前端是程劭非(winter)在极客时间开的一个专栏,在此主要整理我的学习笔记。如有侵权,请联系我,谢谢。

七种语言类型

  • Undefined
  • Null
  • Boolean
  • String
  • Number
  • Symbol
  • Object

Undefined、Null

undefined表示未定义,只有一个值,就是undefined。任何变量在赋值前都是undefined类型。在js里是个变量,但不是关键字,为了防止被重写,在js里用void 0来获取undefined值。一般不会把变量赋值为undefined,这样可以保证所有值为undefined的变量都是未赋值的状态

undefined === void 0;//true

这篇文章解释了void 0 与 undefined

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

猜你喜欢

转载自blog.csdn.net/weixin_33947521/article/details/93180811