《JavaScript语言精粹》学习笔记

按章节来记录的,都是看这本书时的学习笔记,有些地方真的是,不看根本不知道原来是这个样子。

知其所以然的学习过程

2. 语法

  • 注释

在JavaScript中,/ *可能出现在正则表达式字面量里,所以块注释对于被注释的代码块来说是<u>不安全的</u>。

推荐使用 //来做注释

5. 继承

5.2 原型

在一个纯粹的原型模式中,我们将摒弃类,转而关注对象。基于原型的继承相比于基于类的继承在概念上更为简单:<u>一个新对象可以继承一个旧对象的属性。</u>

6. 数组

数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素。数组是一种性能出色的数据结构。不幸的是,JavaScript没有想此类数组一样的数据结构。

作为替代,JavaScript提供了一种拥有一些类数组特性的对象。它把数组的下标转变成字符串,用其作为属性。

  • JavaScript允许数组包含任意混合类型的值。
var misc = ['string', 889, true, false, null, undefined, ['nested', 'array'], {object: true}, NaN];
  • 每个数组都有一个length属性。和大多数其他语言不同,JavaScript的数组的length是没有上界的
  • !!! 数组的length属性不一定等于数组的长度。

array只有一个属性,就是length,length表示的是数组所占内存空间的数目,而不仅仅是数组中元素的个数.

> test[1000] = '4';
< "4"
> test.length
< 1001
array-length.png
  • 删除
    由于JavaScript的数组其实是一个对象,所以可以使用delete test[1]来移除元素。但是遮掩会留下一个空洞,我们希望的是后面的元素依次移动位置,所以我, 可以使用splice(index, num, [])来进行移除。

  • typeof运算符报告数组的类型是objectJavaScript没有一个好的机制来区别数组和对象。

// 有一个不错方法去判断一个对象是否为数组:
Object.prototype.toString.apply(misc) === '[object Array]'

7. 正则表达式

  • 可处理正则表达式的方法有:regexp.execregexp.teststring.matchstring.replacestring.searchstring.split

附录A - 毒瘤

JavaScript中一些不可避免的问题特征,你必须知道这些问题并准备好应对的措施。

  • 伪数组

    • <u>JavaScript没有真正的数组。</u>

    • typeof运算符不能辨别数组和对象。
      要辨别一个值是否是数组,需要检查它的constructor属性。

    
      var array = [1,2,3,4,5];
      // 可以检测是否是数组
      typeof array  === 'object' && array.constructor === Array
    
     // 同样可以检测是否是数组
      Object.prototype.toString.apply(array) === '[object Array]'
    
    • arguments数组不是一个数组,它只是一个有着length成员属性的对象。
  • 假值

JavaScript拥有一组数量庞大的假值。

类型
0 Number
NaN(非数字) Number
' '(空字符串) String
false Boolean
null Object
undefined Undefined

<u>这些值全部都等同于假,但是他们是不可互换的。</u>

undefined和null是全局变量。

  • hasOwnProperty

只是一个方法,而不是一个运算符,所以在任何对象中,他可能会被一个不同的函数甚至一个非函数的值所替换。

another_stooge. hasOwnProperty = null;
  • 对象

JavaScript的对象永远不会是真的空对象,因为它们可以从原型链中取的成员属性。这样,就会带来一些麻烦。

下面是一段程序去极端一算文本中每个单词出现的次数。

var counts = {};
var word;
var words = ['sad', 'wasdaf', 'erae', 'wafc'];
for(i = 0; i < words.length; i ++) {
  word = words[i];
  if(counts[word]) {
    counts[word]++;
  } else {
    counts[word] = 1;
  }
}

这里的if(counts[word])是不严谨的,应该if(typeof counts[word] === 'number)

附录B - 糟粕

在本附录中,将会展示JavaScript的一些有问题的特性,但是我们很容易就能避免它们。

  • ==

JavaScript有梁旭相等运算符: ===和!==,以及它们的邪恶的孪生兄弟==和!=。

如果两个运算数类型一致且拥有相同的值,则===返回true,否则!==返回false。

==和!= 则会在只有两个运算数类型一致的时候才会做出正确的判断。当类型不一致的时候,它们会试图强制转换值的类型,转换的规则复杂且难以记忆。下面有些例子:

表达式
'' == '0' false
0 == '' true
0 == '0' true
false =='false' false
false ==0 true
false == undefined false
false == null false
null == undefined true
'\t\r\n' == 0 true

建议:
永远不要使用==!=

  • with语句
    with语句在这门语言里存在,本身就严重应县了JavaScript处理器的速度,因为它组算了变量名的此法作用域绑定。

建议:
永远不要使用with语句。

  • eval

eval减弱了你的应用程序的安全性,因为它给被求值的文本授予了太大的权利。它也降低了语言的性能。

建议:

  1. 避免使用eval。

  2. Function的构造器是eval的另一种形式,也应该避免使用它。

  3. 浏览器提供的setTimeout和setInterval函数,它们能接受自渡船参数或者函数参数,当传递的是字符串参数时,setTimeout和setInterval函数会像eval那样去处理,所以应该避免使用字符串参数形式。

  • 缺少块的语句

避免ifwhiledofor这样的语句可以接受一个括在花括号中的代码块,也可以接受单行语句。单行语句虽然可以节约2个字节,但是它模糊了程序的结构,会给以后带来隐患,所以不建议使用。

  • ++ --

++ --会使得程序变得拥挤、复杂和隐晦,所以不建议使用。

JavaScript中只有双精度浮点整数。

  • 位运算符

位运算符接近硬件处理,所以非常快,但是JavaScript的执行环境一般接触不到硬件,所以非常慢,JavaScript不建议呗用来执行未操作。

写在后面

GitHub上集大家之力搞了一个前端面试题的项目,里面都是大家面试时所遇到的题以及一些学习资料,有兴趣的话可以关注一下。如果你也有兴趣加入我们的话,请在项目中留言。项目同时也可以在gitbook上查看。

InterviewLibrary-GitHub
InterviewLibrary-gitbook

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

推荐阅读更多精彩内容