《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的实例。


5206717-6ffbec279533c182.png

可见,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)转成数组

5206717-f69e685557c1b336.png

3.对象:

5206717-fbeb5fed8672f892.png
5206717-c9ba17708ef22ddb.png

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

JSON

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值