一、JavaScript基础

1.javaScript 规定了几种语言类型:

答案当然是7种

  1. undefined
  2. null
  3. Object
  4. Number
  5. String
  6. Boolean
  7. Symbol(es6中新添加的数据类型)

接下来谈一下这些数据类型的一些关键知识点

undefined和null

 思考个问题哦:为什么有的编程规范要求用 void 0 代替 undefined?
undefined

  • undefined类型表示未定义,他的值只有一个:undefined
  • 任何变量赋值前都是undefined类型,值为undefined,而不是null
  • undefined 是一个变量而非是个关键字
  • 需要表达这个值,可以用全局变量undefined,也可用void运算

接下来我们针对三点来讨论,得出上述问题的答案

undefined是一个变量,我们避免无意中被篡改,建议使用void 0来获取undefined(等价于void(0)),我们一般不会将变量赋值为undefined,这样可以保证所有的值都为undefined的变量,都是未赋值的自然状态(有不懂undefined为啥会被篡改的可以看下这篇文章https://www.cnblogs.com/qiuxiaozhen/p/10497486.html)

void运算

语法:void express 或者 void(express)

void 运算符所做是,执行表达式express,然后不论表达式是否又返回值,都返回undefined

console.log(void function life () {
        console.log('我是一个void运算符')
       return 100
    }()) //undefined

void运算符如果使用括号,括号内必须有表达式,如果是void() 会被视为执行名为void的函数,报错SyntaxError

死链接

我们有时候会用href="#"标识一个死链接,但是这样会导致页面跳转到最上面的视图,#包含了一个位置信息,默认的锚的是#top,也就是网页的上端,网页很长的时候会使用#来定位页面的具体位置,格式为#+id

href="javascript:void(0)"用来禁止a标签的跳转行为,**javascript:**是伪协议,标识url的内容通过javasript来执行,**void(0)**表示不进行任何操作

<a href="javascript:void(0)" onClick="window.open()">点击a</a> <!-- 点击链接后 页面不动,只打开链接-->
<a href="#" onclick="javascript: return false">ClickMe</a> <!-- 作用一样 -->

null

  1. 只是一个值,就是null
  2. 标识空值,是一个关键字,可以放心的使用null关键字来获取null值

string

  1. string的意义并非”字符串“,而是字符串的UTF16编码,字符串的最大长度是受字符串编码长度影响的,最大长度是2^53 - 1.
  2. 字符串是永远无法变更的,一旦字符串被构造出来,无法用任何方式改变字符串的内容,像String.toUpperCase()这样的方法,是返回一个新的字符串,而不是修改原字符串
  3. 字符串把每个UTF16单元当做一个字符来处理,所以处理非BMP(超出U+0000-U+FFFF范围)的字符时,应该格外小心。这个设计继承自Java,现实中很少用到BMP之外的字符。

Number

思考下面的问题:为什么在 JavaScript 中,0.1+0.2 不等于0.3

  1. number类型有2^64- 2^53+3 个值。
  2. 基本符合IEEE 754-2008规定的双精度浮点数规则,但也有额外几个表达的语言场景(比如不让除以0出错,引入了无穷大)。
    1. NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字
    2. Infinity,无穷大
    3. -Infinity,负无穷大
  3. 有+0和-0,加法运算中没有区别,但是除法要区分,“忘记检测除以 -0,而得到负无穷大”的情况经常会导致错误,而区分 +0 和 -0 的方式,正是检测 1/x 是 Infinity还是-Infinity
  4. 根据双精度浮点数定义,有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff,无法精确表示此范围外的整数。
  5. 根据双精度浮点数定义,非整数的Number类型无法用==来比较(三个等号也不行),正确的比较方法是用JavaScript提供的最小精度值:
console.log(0.1 + 0.2 == 0.3) // false

//正确的比较方法
console.log(Math.abs(0.1 + 0.2 - 0.3) <= Number. EPSILON)
// Number.EPSILON实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

symbol

 

 symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,即使描述相同,symbol值也不相等

  1. 表示独一无二的值,他是一切非字符串的对象key的集合
  2. symbol值通过symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种就是原来就有的字符串,另一种是新增的symbol类型。凡是属性名是symbol类型的,就都是独一无二的,可以保证不会与其他属性名产生冲突
let s1 = Symbol('foo')
let s2 = Symbol('foo')
console.log(s1 == s2) // false

      3. 一些标准中提到的symbol,可以在全局的symbol函数的属性中找到。例如,我们可以使用Symbol.iterator来自定义for

…of在对象上的行为

var o = new Object
    console.log(Symbol.iterator)
    o[Symbol.iterator] = function () {
        var v = 0
        return {
            next: function () {
                return { value: v++, done: v>10}
            }
        }
    }
    for(var v of o)
        console.log(v)// 0 1 2 3...9

 

Object

问题:为什么给对象添加的方法上能用在基本类型上?

  1.  JavaScript对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是key-value结构,key可以使字符串类型也可以是Symbol类型
  2. JavaScript的“类”仅仅是运行是对象的一个私有属性,而JavaScript是无法自定义类型的
  3. Number,String和Boolean,三个构造器是两用的,当跟new搭配时,他们产生对象,当直接调用时,他们表示强制类型转换
  4. Symbol函数比较特殊,直接用new调用他会跑出错误,但他任然是Symbol对象的构造器
  5. 我们在原型添加方法,都可以应用于基本类型
    Symbol.prototype.hello = () => console.log("hello");

    var a = Symbol("a");
    console.log(typeof a); //symbol,a 并非对象
    a.hello(); //hello,有效

上述问题的答案是:运算符提供了装箱操作,他会根据基础类型构造一个临时对象,使得能够在基础类型上调用对应对象的方法。

装箱和拆箱

装箱转换:基本类型->对象

  • 每一种基本类型,都在对象中有对应的类,装箱机制会频繁的产生临时对象
  • 使用Object函数,可以显示调用装箱的能力
  • 每一类装箱对象皆有私有的Class属性,这些属性可以Object.prototype.toString 获取,在JavaScript中,没有任何方法可以更改私有的Class属性,因此Object.prototype.toString可以准确识别对象对应的基本类型的方法,他比instanceof更加准确
  • call函数本身会产生装箱操作,需要配合typeOf来区分基本类型还是对象类型

​​拆箱装换:对象->基本类型

  • ToPrimitive 函数,它是对象类型到基本类型的转换
  • 拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型。如果valueOf 和 toString都不存在,或者没有返回基本类型,则会产生TypeError

对象的运算

    var o = {
        valueOf : () => {console.log("valueOf"); return {}},
        toString : () => {console.log("toString"); return {}}
    }

    o * 2
    // valueOf
    // toString
    // TypeError

String的拆箱

    var o = {
        valueOf : () => {console.log("valueOf"); return {}},
        toString : () => {console.log("toString"); return {}}
    }

    o + ""
    // toString
    // valueOf
    // TypeError

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值