《Javascript语言精粹》笔记

语法

1.数字

a. javascript只有一种数字类型,表示64位的浮点数,避免了短整型的溢出问题。1和1.0是相等的

b. 一个数字字面量有指数部分,那么字面量的值等于e之前的数字与10的e之后的数字的次方相等。所以100===1e2

c. NaN是一个数值,不等于任何值,包括他自己。可用isNaN(number)检测NaN。

d. Infinity无穷大

2.字符串

a. 用单引号或者双引号,\(反斜线)是转义字符,由于Unicode是一个16位的字符集,所以javascript的字符串也是16位的。

b. \u指定数字字符编码,如 “A” === "\u0041"

c. 字符串有length属性

d. 字符串是不可变的,但是可以通过+运算创建新的字符串

3.语句

a. switch、while、for和do语句允许有一个可选的前置标签,配合break使用。

b. false,null,undefined,空字符串'   ',数字0,数字 NaN都是假,其他所有值都是真,包括true,字符串“false”,以及所有的对象。

c. for in语句。通常需要检测object.hasOwnProperty(variable)来确定这个属性名是该对象的成员,还是来自于原型链。

for(myvar in obj){

if(obj.hasOwnProperty(myvar)){...}

}

4.表达式

a. typeof 运算符产生的值有 'number'、'string'、'boolean'、'undefined'、'function'和'object'。数组或者null,结果是'object'

对象

javascript的简单数据类型包含数字、字符串、布尔值、null和undefined。其他所有的值都是对象。

一个对象字面量就是包围在一对花括号中的零或多个“名/值”对。

对象是“名/值”对的集合并拥有一个连到原型对象的隐藏链接。

1.引用

对象通过引用来传递,永远不会被复制。

2.原型

每个对象都连接到一个原型对象,并且它可以从中继承属性。所有通过对象字面量创建的对象都连接到Object.prototype。

原型链在更新时是不起作用的。当我们对某个对象作出改变是,不会触及该对象的原型,原型链只有在检索值的时候才会被用到。

原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有寄语该原型创建的对象可见。

function F(){}

F.prototype.a=[1,2];

var f = new F();

f.a.push(3);

F.prototype.a;//[1,2,3]原型被修改

f.a = null;

F.prototype.a;//[1,2,3]原型不变

3.删除

delete运算符可以用来杀喊出对象的属性。如果对象包含该属性,那么该属性就会被移除。它不会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性透视出来。

4.减少全局变量污染

方法一、只创建一个唯一的全局变量。var MYAPP = {};

方法二、闭包

函数

1.函数对象

对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该源性对象本身连接到Object.prototype)。每个函数在创建的时候会附加两个隐藏属性:函数的上下文和实现函数行为的代码。

一切对象都是Object的实例,一切函数都是Function的实例。Object是Function的实例,而Function.prototype是Object的实例。


可见,Object作为构造函数,它有prototype属性指向Object.prototype, 作为实例对象, 它有Object.__proto__指向Function.prototype。Function是构造函数,它有prototype属性指向Function.prototype,而Function是函数,从而也是Function的实例,所以它有Function.__proto__指向Function.prototype,从而Function.__proto__ === Function.prototype为true。

2.调用

每个函数在调用是都会接受两个附加参数,this和arguments

4种调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。

方法调用模式:函数保存为对象的一个属性,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象

函数调用模式:当函数并非是一个对象的属性时,那么他就被当做一个函数来调用,此时this绑定到全局对象

构造器调用模式:一个函数,如果创建的目的就是希望结合new前缀来调用,就称它为构造器函数,首字母大写。调用之后,实例对象的__proto__会链接到构造函数prototype的,this会被绑定到新对象上。

Apply调用模式:apply方法让我们构建一个参数数组传递给调用函数。它允许我们选择this的值。apply接收两个参数,要绑定给this的值和参数数组。call,bind

function Qua(string){this.status = string}

Qua.prototype.get_status = function(){

return this.status;
}

//构造一个包含status的对象

var statusObject = {status:'A-OK'};

//statusObject并没有继承Qua.prototype,但是可以调用get_status

var status = Qua.prototype.get_status.apply(statusObject);//传入this,this指statusObject。结果是A-OK

3.参数

arguments并不是一个真正的数组,它只是一个类似数组的对象,拥有length属性,但没有任何数组的方法。

4.闭包

函数可以访问它被创建时的所处的上下文环境。内部函数能访问外部函数的实际变量而无需复制。

//错误示例

var add_the_handlers = function(nodes){

   var i;

for(i=0;i<nodes.length;i++){

nodes[i].onclick = function(){

alert(i);

}

}

}

//该函数的本意是想传递给每个事件处理器一个唯一的i,但是事件处理器函数绑定了变量i本身,而不是函数在构造是的变量i的值

//改良版

var add_the_handlers = function(nodes){

var helper = function(i){

return function(e){alert(i)}

}

var i;

for(i=0;i<nodes.length;i++){

nodes[i].onclock=helper(i);//返回当前的i值

}

}

方法

1.Array

concat(item,...):如果参数item是数组,那么他的每一个元素会被分别添加

join(separator):默认的separator是逗号。

pop():移除数组中的最后一个元素并返回该元素。如果数组是empty,那么返回undefined

push(item...):把一个或多个参数item附加到数组尾部,如果item是数组,会把item座位整体添加到数组尾部,并返回这个array的新长度值。

reverse():反转数组中的元素顺序,并返回数组本身[数组被改变了]。

shift():移除数组中的第一个元素并返回该元素,如果是空数组,返回undefined。shift通常比pop慢的多。

slice(start,end):对数组中的一段做浅复制。

sort(comparefn):对数组中的元素进行排序,不能正确地给一组数字排序。因为javascript默认的比较函数会把被排序的元素都视为字符串。

splice(start,deleteCount,item...):从数组中移除一个或多个元素,并用新的item替换他们。

unshift(item...):和push类似,只是他是把item插入到数组的开始部分,并返回数组心得length。

2.Function

apply(thisArg,argArray):传递一个绑定到this上的对象和一个可选的数组作为参数。

3.Number

toExponential(fractionDigits):传换成一个指数形式的字符串,可选参数是控制小数点后的数字位数,值必须在0-20.

toFixed(fractionDigits):转换成一个十进制形式的字符串,可选参数是控制小数点后的数字位数,值必须在0-20,默认值是0

toPrecision(precision):转换成一个十进制数形式的字符串。可选参数是控制数字的精度[和控制小数点位数是不一样的,从整数部分算起],值必须在0-21

toString(radix):转成字符串。可选参数radix控制基数,值在2-36之间,常用的是整数,但是可以用任意的数字。在最普通的情况下number.toString()可以简单写成String(number)。

4.Object

hasOwnProperty(name):如果一个object包含一个名为name的属性,那么hasOwnproperty返回true。原型链中的同名属性是不会被检查的。

var a = {member:true};
var b = Object.create(a);

a.hasOwnproperty('member');//true

b.hasOwnproperty('member');//false

b.member;//true

5.RegExp

regexp.exec(string):是使用正则表达式最强大(和最慢)的方法。匹配成功会返回一个数组。下标为0的是包含正则表达式regexp匹配的子字符串,下标为1的元素是分组1捕获的文本...以此类推,如果匹配失败,返回null。

regexp.test(string):最近单和最快的方法。尽量不要对这个方法使用g标识。返回true或false

6.String

string.charAt(pos):返回string中pos位置的字符。如果pos小于0或大于等于字符串的长度,返回空字符串。

string.charCodeAt(pos):返回string中pos位置处的字符的字符码位。如果pos小于0或大于等于字符串的长度,返回空NaN

string.concat(string...)

string.indexOf(searchString,position):查找子串的位置

string.lastIndexOf(searchString,position):从末尾开始查找,但是position是从前往后数

var text = 'Mississippi';

text.lastIndexOf('ss');//5

text.lastIndexOf('ss',3);//原始string变成Miss   结果是2

text.lastIndexOf('ss',6);//原始串变成Mississ  结果是5

string.localeCompare(that):

string.match(regexp):

string.replace(searchValue,replaceValue):只会替换第一次出现的,所以一般searchValue是一个带有g标识的正则,这样可以替换所有的匹配,如果不带g,则只会替换第一个匹配。

string.search(regexp):参数是正则表达式,且会忽略g标识

string.slice(start,end):复制string的一部分出来构造一个新的字符串。如果start/end是负数,会与string.length相加

string.split(separator,limit):separator可以是字符串也可以是正则,limit显示切片数量

string.substring(start,end):没有任何理由去使用substring方法,用slice代替

string.toLocaleLowerCase():返回一个新的字符串,使用本地化的规则把string中的所有字幕转换为小写格式。此方法主要永在土耳其语上,因为在土耳其语中‘I’转换为‘l’,而不是‘i’。

string.toLocaleUpperCase():转换大写格式,解释参照toLocaleLowerCase()

string.toLowerCase():

string.toUpperCase():

String.fromCharCode(char...):根据一串数字编码返回一个字符串  

var a = String.fromCharCode(67,97,116);//a是Cat

毒瘤

1.判断数字:var isNumber = function(num){return typeof num === 'number' && isFinite(num);}

2.判断是数组的可靠方法:

Object.prototype.toString.apply(arr) === '[object Array]'

Object.prototype.toString.apply(arguments) === '[object Arguments]'//可以判断arguments数组不是真正的数组,只是含有length属性而已,要通过Array.prototype.slice.apply(arguments)转成数组

3.对象:

可以看到,constructor却是一个字符串,原因在于count对象继承自Object.prototype,而Object.prototype包含着一个名为constructor的成员对象它的值是一个Object,所以相加就变成了字符串拼接。解决办法是添加一个判断typeof count[word] == 'number'

JSON

json有6种类型的值,对象,数组,字符串,数字,布尔值和null。空白(空格,制表,回车,换行符)可被插入到任意值的前后。

使用JSON.parse可以代替evel带来的风险

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

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,212评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 首发于:segmentfault《JavaScript语言精粹 修订版》 读书笔记 之前看到这篇文章,前端网老姚浅...
    若川i阅读 870评论 0 3
  • 《红楼梦》中贾政喜欢和清客在一起,只要在家里,身前身后总有一帮人围绕着。在《红楼梦》的第十六回作者通过大观园的兴建...
    桃花月球阅读 2,372评论 4 8
  • ​时光 不经意间 偷走你的记忆 让你不由自主地 用想象去填补那个空缺 而你也不会对此感到怀疑 记忆的模样 就像星辰...
    瘦子的逆袭阅读 166评论 0 1