语法
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带来的风险