ES6番外1

整数的工作机制

在之前类型化数组里有讨论到关于js存储数字类型的不同,IEEE 754引起了很多的混乱。js需要付出巨大努力才能确保开发人员不必担心数字编码的细节,但问题仍然不时泄漏。ES 6旨在通过使整数更容易识别和使用来解决这个问题。

识别整数

ES6添加了Number.isInteger方法来表示是否整数。虽然js使用IEEE 754编码系统来表示整数和浮点型,但是他们的存储有些不同,isInteger就是利用这一点,去检查值是不是一个整数。这就意味着看起来是浮点型的数字,可能存储的是整数,导致isInteger返回的是true

console.log(Number.isInteger(25));      // true
console.log(Number.isInteger(25.0));    // true
console.log(Number.isInteger(25.1));    // false
Safe Integers

IEEE 754只能准确地表示-2的53次方2的53次方之间的整数,并且在这个“安全”范围之外,二进制最终会复用于多个数值。
这就意味着js只能表示这个安全范围内的数字:

console.log(Math.pow(2, 53));      // 9007199254740992
console.log(Math.pow(2, 53) + 1);  // 9007199254740992

可以发现,超出这个范围就不行了。
ES6通过Number.isSafeInteger方法去识别一个数字是不是安全的。Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER表示最大和最小的值。
看下面这个例子:

var inside = Number.MAX_SAFE_INTEGER,
    outside = inside + 1;

console.log(Number.isInteger(inside));          // true
console.log(Number.isSafeInteger(inside));      // true

console.log(Number.isInteger(outside));         // true
console.log(Number.isSafeInteger(outside));     // false

你可以试下,MAX_SAFE_INTEGER就是2的53次方减1

new math methods

ECMAScript 6Math对象添加了几种方法,以提高常见数学计算的速度。提高通用计算的速度还可以提高执行许多计算的应用程序的整体速度,例如图形程序。

Math.acosh(x)返回x的反双曲余弦值。
Math.asinh(x)返回x的反双曲正弦值。
Math.atanh(x)返回x的反双曲正切
Math.cbrt(x)返回x的立方根。
Math.clz32(x)返回x的32位整数表示中的前导零位数。
Math.cosh(x)返回x的双曲余弦值。
Math.expm1(x)返回从x的指数函数中减去1的结果。
Math.fround(x)返回x的最近的单精度浮点数。
Math.hypot(... values)返回每个参数的平方和的平方根。
Math.imul(x,y)返回执行两个参数的真正32位乘法的结果。
Math.log1p(x)返回1 + x的自然对数。
Math.log10(x)返回x的基数10对数。
Math.log2(x)返回x的基数2对数。
Math.sign(x)如果x为负,则返回-1;如果x为+0或-0,则返回0;如果x为正,则返回1。
Math.sinh(x)返回x的双曲正弦值。
Math.tanh(x)返回x的双曲正切值。
Math.trunc(x)从float中移除小数位并返回一个整数。

解释每种新方法及其详细功能超出了本章的范围。但是,如果对应用程序需要进行常见的计算,请务必在自己实现之前检查新的Math方法。

Unicode Identifiers

ES6相对之前的版本提供了更好的支持,它还可以更改可用作标识符的字符。在ECMAScript 5中,已经可以将Unicode转义序列用于标识符。例如:

// Valid in ECMAScript 5 and 6
var \u0061 = "abc";

console.log(\u0061);     // "abc"

// equivalent to:
console.log(a);          // "abc"

在此示例中的var语句之后,可以使用\ u0061a来访问该变量。在ECMAScript 6中,还可以使用Unicode代码点转义序列作为标识符,如下所示:

// Valid in ECMAScript 5 and 6
var \u{61} = "abc";

console.log(\u{61});      // "abc"

// equivalent to:
 console.log(a);          // "abc"

此外,ECMAScript 6根据Unicode标准附件#31:Unicode标识符和模式语法正式指定了有效标识符,它提供了以下规则:

  1. 第一个字符必须是$_或任何带有ID_Start的派生核心属性的Unicode符号。
  2. 每个后续字符必须是$_\ u200c(零宽度非连接符),\ u200d(零宽度连接符),或具有ID_Continue的派生核心属性的任何Unicode符号。

ID_StartID_Continue派生的核心属性在Unicode标识符和模式语法中定义,作为识别适用于变量和域名等标识符的符号的方法。该规范不是特定于JavaScript。

Formalizing the proto Property

甚至在ECMAScript 5``完成之前,几个JavaScript引擎已经实现了一个名为__proto__的自定义属性,可用于获取和设置[[Prototype]]属性。实际上,__ proto__Object.getPrototypeOfObject.setPrototypeOf方法的早期前身。期望所有JavaScript引擎删除此属性是不现实的(有流行的JavaScript库使用__proto__),因此ECMAScript6也正式化了__proto__行为。但正式化出现在ECMA-262的附录B中以及此警告:

这些功能不被视为核心ECMAScript语言的一部分。编写新的ECMAScript代码时,程序员不应使用或假设存在这些特性和行为。不鼓励ECMAScript实现这些功能,除非实现是Web浏览器的一部分或者需要运行Web浏览器遇到的相同的旧ECMAScript代码。

ECMAScript规范建议使用Object.getPrototypeOfObject.setPrototypeOf,因为__proto__具有以下特征:

  1. 只能在对象文字中指定__proto__一次。如果指定两个__proto__属性,则会引发错误。这是具有该限制的唯一对象文字属性。
  2. 计算形式[“__ proto__”]的作用类似于常规属性,不会设置或返回当前对象的原型。与对象文字属性相关的所有规则都适用于此形式,而非计算形式则具有例外。

虽然应该避免使用__proto__属性,但规范定义它的方式很有趣。在ECMAScript 6引擎中,Object.prototype .__ proto__被定义为一个访问器属性,其get方法调用Object.getPrototypeOf并且其set方法调用Object.setPrototypeOf方法。这与使用__proto__Object.getPrototypeOf/ Object.setPrototypeOf之间没有什么区别,只是__proto__允许直接设置对象文字的原型。看下面例子:

let person = {
    getGreeting() {
        return "Hello";
    }
};

let dog = {
    getGreeting() {
        return "Woof";
    }
};

// prototype is person
let friend = {
    __proto__: person
};
console.log(friend.getGreeting());                      // "Hello"
console.log(Object.getPrototypeOf(friend) === person);  // true
console.log(friend.__proto__ === person);               // true

// set prototype to dog
friend.__proto__ = dog;
console.log(friend.getGreeting());                      // "Woof"
console.log(friend.__proto__ === dog);                  // true
console.log(Object.getPrototypeOf(friend) === dog);     // true

此示例不是调用Object.create来创建friend对象,而是创建一个标准对象文字,为__proto__属性赋值。使用Object.create方法创建对象时,必须为任何其他对象属性指定完整属性描述符。不够直接。

原文请戳这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,526评论 0 8
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,142评论 0 13
  • 1 Object 对象 教程:https://wangdoc.com/javascript/stdlib/obje...
    智勇双全的小六阅读 1,680评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,226评论 0 4
  • 你这是个什么地方? 因为身上没有现金, 于是柒柒一出门就开始在手机上搜索附近的ATM,最终选择的半小时车程的地方,...
    阿闲非闲阅读 385评论 0 0