javascript 中的 value

You Don't Know JS
Value学习笔记

Array

var a = [ ];

a["13"] = 42;

a.length; // 14

应当注意到,在javascript中如果key只是一个数字字符串,将会被转化成十进制的key并且,会改变长度。

Array-like

在js中有两个常用到的类数组对象,一个是查找dom节点的结果对象,一个是函数的arguments属性。
将类数组对象转化为数组对象常见的有两种方式。


function foo() {
    var arr = Array.prototype.slice.call( arguments )
    arr.push( "bam" );
    console.log( arr );
}

foo( "bar", "baz" ); // ["bar","baz","bam"]

通过es6新加属性Array.from进行转化:

var arr = Array.from( arguments )

strings

在javascript中数组是可变数据类型,而字符串是不可变数据类型。

var a = "foo";
var b = ["f","o","o"];

a[1] = "O";
b[1] = "O";

a; // "foo"
b; // ["f","O","o"]

//注意大小写不同。

字符串的不可变特性也导致了字符串的自有函数无法改变其自身,而是返回一个新的字符串

c = a.toUpperCase();
a === c;    // false
a;          // "foo"
c;          // "FOO"

b.push( "!" );
b;          // ["f","O","o","!"]

当然我们也可以借用Array的自有函数去处理字符串,只有不改变自身的Array函数才可以!!!!

a.join;         // undefined
a.map;          // undefined

var c = Array.prototype.join.call( a, "-" );
var d = Array.prototype.map.call( a, function(v){
    return v.toUpperCase() + ".";
} ).join( "" );

c;              // "f-o-o"
d;              // "F.O.O."

尝试可改变自身Array.reverse方法去操作字符串:


Array.prototype.reverse.call( "strong" ) 

//Uncaught TypeError: Cannot assign to read only property '0' of object '[object String]'

将字符串反向输出的一个小方法:(注意这个方法不能改变unicode字符)

var c = a
    // split `a` into an array of characters
    .split( "" )
    // reverse the array of characters
    .reverse()
    // join the array of characters back to a string
    .join( "" );

c; // "oof"

Number

数字的语法

js只有一种数字类型:number,包括"整数"和小数形式。整数打引号是因为在js中,没有严格意义上的整数这也是一直以来js被人诟病的地方。

在js中的整数就是没有小数的十进制数。所以42.0及等同于整数42。

与大部分现代编程语言一样,js中的数字类型是基于IEEE 754标准来实现,该标准通常也被称为“浮点数”。js使用的是64位二进制。


var b = 42.

这种写法在js当中是可以的,但是为了可读性,并不建议这样写。

Number.prototype 中的toFixed()方法可指定小数部分的显示位数:


var a = 42.59

a.toFixed( 0 ); // "43"
a.toFixed( 1 ); // "42.6"
a.toFixed( 2 ); // "42.59"
a.toFixed( 3 ); // "42.590"
a.toFixed( 4 ); // "42.5900"
//多出位置用0补齐。

toPrecision(..) 方法用来指定有效数位的显示位数(四舍五入):

var a = 42.59;
a.toPrecision( 1 ); // "4e+1"
a.toPrecision( 2 ); // "43"
a.toPrecision( 3 ); // "42.6"
a.toPrecision( 4 ); // "42.59"
a.toPrecision( 5 ); // "42.590"
a.toPrecision( 6 ); // "42.5900"

较小的数值。

在大多数的编程语言当中,都面临下面的问题


0.1 + 0.2 === 0.3; // false

解决办法就是设立一个误差范围。称为“机器精度”。这个值通常是 2^-52 (2.220446049250313e-16)。

从 ES6 开始,该值定义在 Number.EPSILON 中

function numbersCloseEnoughToEqual(n1,n2) {
 return Math.abs( n1 - n2 ) < Number.EPSILON;
}

检验整数

在es6当中,提供了Number.isInteger函数来进行检验。首先检验是否为整数格式,然后检验是否在js允许的范围内。

Number.isInteger( 42 );     // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 );   // false

Number.isSafeInteger( Number.MAX_SAFE_INTEGER );    // true
Number.isSafeInteger( Math.pow( 2, 53 ) );          // false
Number.isSafeInteger( Math.pow( 2, 53 ) - 1 );      // true

32 位有符号整数

虽然整数最大能够达到 53 位,但是有些数字操作(如数位操作)只适用于 32 位数字,
所以这些操作中数字的安全范围就要小很多,变成从 Math.pow(-2,31)(-2147483648,
约-21 亿)到 Math.pow(2,31) - 1(2147483647,约 21 亿)。
a | 0 可以将变量 a 中的数值转换为 32 位有符号整数,因为数位运算符 | 只适用于 32 位
整数(它只关心 32 位以内的值,其他的数位将被忽略)。因此与 0 进行操作即可截取 a 中
的 32 位数位。

null和undefined

undefined指从未赋值。
null指曾赋过值,但是目前还没有。
null是一个特殊关键字,不是标识符,我们不能将其当做变量来使用或赋值。然而undefined却是一个标识符,可以被当作变量来使用或赋值。

function foo() {
 undefined = 2; // 非常糟糕的做法!
}
foo();
function foo() {
 "use strict";
 undefined = 2; // TypeError!
}
foo();

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

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 190评论 0 0
  • 时光匆匆,人生已经度过二十四个春秋。从大学毕业到工作已经一年有余,在这段时间里,有过迷茫,有过焦虑,有过成长。...
    远逝之风yuki阅读 145评论 0 1
  • 远方的人今天刷朋友圈,看到《西藏时光》的预告片,片尾曲是朋友的歌,于是网上找了他的《西行月》,他的歌里最喜欢的一首...
    蛋之凝视阅读 248评论 0 0
  • 图片发自简书App 我买的是inter的mlc240g,装机完成后试了下分只有500多,感觉性价比不怎么高。 拆T...
    鬼杰哈阅读 29,429评论 1 2