《重学前端》学习笔记(1)

JavaScript类型

关于前端工程师成长,需要两个视角:

  • 立足标准,系统性总结和整理前端知识,建立自己的认知和方法论;
  • 放眼团队,从业务和工程角度思考前端团队的价值和发展需要。只有这样做,才能够持续发展,在高速发展的技术和工程浪潮中稳稳立足。

两个前端学习方法:

  • 建立知识架构

    是建立自己的知识架构,并且在这个架构上,不断地进行优化。

  • 追本溯源,找到知识的源头。

JavaScript类型

运行时类型是代码实际执行过程中我们用到的类型。所有的类型数据都会属于 7 个类型之一。从变量、参数、返回值到表达式中间结果,任何 JavaScript 代码运行过程中产生的数据,都具有运行时类型。

类型:

JavaScript 语言的每一个值都属于某一种数据类型。 JavaScript 语言规定了 7 种语言类型:

  • Undefined;
  • Null;
  • Boolean;
  • String;
  • Number;
  • Symbol;
  • Object。
  • Undefined、Null

Undefined 、Null

  • undefined:未定义,如果一个变量只声明但是未赋值,默认值就是undefined

     var a; 
     console.log ( a );//undefined  变量的值 
     console.log ( typeof  a );//undefined  变量值的数据类型
    
  • null:空值 ,null这个值只能手动去设置,一个变量在任何情况下它的值都不会主动是null

    var b = null; 
    console.log ( b );//null 
    console.log ( typeof b );//object  注意:null这个数据类型在使用typeof检测的时候得到object 
    
  • undefined与null的区别:

    console.log ( undefined == null );//true   它们的值是一样都是没有值得意思 console.log ( undefined === null );//false    它们的值一样但是数据类型不一样
    
  • 为什么有的编程规范要求用 void 0代替 undefined

    因为 JavaScript 的代码 undefined 是一个变量,而并非是一个关键字,这是 JavaScript 语言公认的设计失误之一,所以,我们为了避免无意中被篡改,我建议使用 void 0 来获取 undefined 值。

Boolean

Boolean 类型有两个值,truefalse,它用于表示逻辑意义上的真和假,同样有关键字 true 和 false 来表示两个值。

String

String 用于表示文本数据。String 有最大长度是 2^53 - 1,这在一般开发中都是够用的,但是这个所谓最大长度,并不完全是你理解中的字符数。因为 String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAtcharCodeAtlength 等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。

  • JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。
  • JavaScript 字符串把每个 UTF16 单元当作一个字符来处理,所以处理非 BMP(超出 U+0000 - U+FFFF 范围)的字符时,你应该格外小心。
  • JavaScript 这个设计继承自 Java,最新标准中是这样解释的,这样设计是为了“性能和尽可能实现起来简单”。因为现实中很少用到 BMP 之外的字符。

Number

  • JavaScript 中的 Number 类型有 18437736874454810627(即 2^64-2^53+3) 个值。

  • JavaScript 中的 Number 类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但是 JavaScript 为了表达几个额外的语言场景(比如不让除以 0 出错,而引入了无穷大的概念),规定了几个例外情况:

    • NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
    • Infinity,无穷大;
      --Infinity,负无穷大。
  • JavaScript 中有 +0-0,在加法类运算中它们没有区别,但是除法的场合则需要特别留意区分,“忘记检测除以 -0,而得到负无穷大”的情况经常会导致错误,而区分 +0 和 -0的方式,正是检测 1/x 是Infinity 还是 -Infinity。

  • 同样根据浮点数的定义,非整数的 Number 类型无法用 ===== 也不行) 来比较,一段著名的代码,这也正是,为什么在 JavaScript 中,0.1+0.2不能=0.3;的原因。

     console.log( 0.1 + 0.2 == 0.3); //false
    

    所以实际上,这里错误的不是结论,而是比较的方法,正确的比较方法是使用 JavaScript 提供的最小精度值:

    console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
    

    检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。这段代码结果就是 true 。

Symbol

Symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑。

Symbol 可以具有字符串类型的描述,但是即使描述相同,Symbol 也不相等。

Object

在 JavaScript 中,对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key 可以是字符串或者 Symbol 类型。

  • JavaScript 中的几个基本类型,都在对象类型中有一个“亲戚”。它们是:

    • Number
    • String
    • Boolean
    • Symbol

    所以,我们必须认识到 3new Number(3)是完全不同的值,它们一个是 Number 类型, 一个是对象类型

  • Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。

类型转换

  • StringToNumber
  • NumberToString
  • 装箱转换
  • 拆箱转换

事实上,“类型”在 JavaScript 中是一个有争议的概念。一方面,标准中规定了运行时数据类型; 另一方面,JS 语言中提供了typeof 这样的运算,用来返回操作
数的类型,但 typeof 的运算结果,与运行时类型的规定有很多不一致的地方。我们可以看下表来对照一下。
在这里插入图片描述

发布了33 篇原创文章 · 获赞 73 · 访问量 2782

猜你喜欢

转载自blog.csdn.net/weixin_46124214/article/details/104149042
今日推荐