JS作用域是基于词法作用域的顶级对象。

JS是一门弱类型语言,强类型能在编译时检测错误。

JS是唯一一门所有浏览器都能识别的语言。

块注释对于被注释的代码是不安全的,例如/*  var rm=/a*/.match(s);  */

JS只有一个数字类型,没有分离出整数类型,完全避免了短整型的溢出问题。

NaN不等于任何值,包括他自己。

JS所有字符都是16位。

JS允许数组包含任意类型的值。

字符串是不可变的,一旦被创建,永远无法改变它,但是可以通过+运算符连接其他字符串来创建一个新字符串。

2个包含着完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串,所以'c'+'a'==='ca'是true

switch,while,for,do语句配合break语句来使用。

 

falsy的值:

  • false
  • null
  • undefined
  • 空字符串''
  • 数字0
  • 数字NaN

其他都被当做真。

 

for in会枚举一个对象的所有属性名(键名),需要object.hasOwnProperty(variable)来确定这个属性名是该变量对象的成员还是来自原型链。

do在代码块执行后再检测,while在执行前检测。

+运算符可以进行加法运算或字符串连接。如果想加法运算,两个运算数都得是数字。

如果第1个运算数的值为假,运算符&&产生第1个运算数的值,否则产生第2个运算数的值。

如果第1个运算数的值为真,运算符||产生第1个运算数的值,否则产生第2个运算数的值。

 

JS简单数据类型包括数字,字符串,布尔值,null值,undefined值,其他所有的值都是对象。

检索方式:

  • []
  • .(优先考虑)

如果字符串是合法的JS标识符且不是保留字,那么也可以用.来检索。

||可以填充默认值:var middle=stooge["middle-name"]||"(none)";

对象里的值可以通过赋值语句来更新,如果属性名已存在对象里,那么这个属性的值就会被替换。如果对象之前没有那个属性名,那么该属性就扩充到对象中。

Object.create()可以创建一个使用原对象作为其原型的新对象。

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

对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype。每个函数在创建时会附加2个隐藏属性:函数上下文和实现函数的代码。

当实参的个数>形参的个数,超出的参数值被忽略。

当实参的个数<形参的个数,缺失的参数值被替换为undefined。

  1. 方法调用模式。就是一个函数被保存为对象的一个属性。当一个方法被调用时,this被绑定到该对象。this到对象的绑定发生在调用的时候。
  2. 函数调用模式。this被绑定到全局对象,可以通过定义一个变量that保存this。
  3. 构造器调用模式。如果在一个函数前面加上new来调用,会创建一个连接到该函数的prototype成员的新对象,同时this被绑定到那个新对象上。
  4. apply调用模式。apply接收2个参数,第1个是要绑定给this的值,第2个是一个参数数组。

当函数被调用,可以通过arguments数组来访问到所有它被调用时传递给它的参数列表。(包括实参>形参,超出的实参)

throw语句中断函数的执行,它会抛出一个exception对象,该对象包含一个用来识别异常类型的name属性和message属性。这个exception对象会被传递到try的catch从句。

var add=function (a,b){
 throw{
   name:'TypeError',
  message:'add needs numbers'
  };
}
var try_it=function(){
   try{
   add('7');
    }cache(e){
    document.write(e.name+':'+e.message);
   }
}

 

移除首尾空格的方法:

String.method('trim',function(){
  return this.replace(/^\s+|\s+$/g,'');
}

 

要确定没有该方法时才添加方法:Function.prototype.method=function(name,func){}

使用函数和闭包来构造模块。

 级联可以在一个语句中一次调用同一个对象的很多方法。A.().B().C()

柯里化(局部套用),把多参数函数转换为一系列单参数函数并进行调用的技术。

记忆:将先前的操作结果记录在某个对象里,避免无谓的重复计算。比如斐波那契数列。

优化前:

var fib=function(n){
  return n<2?n:fib(n-1)+fib(n-2);
}
for(var i=0;i<=10;i++){
  console.log(fib(i));
}

优化后:

var memoizer=function(memo,formula){
  var fib=function(n){
      var result=memo[n];
       if(typeof result !=='number'){
         result=fib(n-1)+fib(n-2);
         memo[n]=result;
       }
      return result;
  };
 return fib;
};
var fibb=memoizer([0,1],function(fib,n){
 return fib(n-1)+fib(n-2);
});

 

当一个函数对象被创建时,构造器产生的函数对象赋予一个prototype属性,它的值是一个包含constructor属性且属性值为该新函数的对象。

用new调用一个函数时,函数执行方式:1.创建一个新对象,继承自构造器函数的原型对象 2.调用构造器函数,绑定this到新对象上 3.如果它的返回值不是一个对象,就返回该新对象。

差异化继承:

var myMammal={
  name:'hello',
   get_name:funcrion(){
     return this.name;
   },
  says:function(){
    return this.saying||'';
   }
}
var myCat=Object.create(myMammal);
myCat.name='world';
myCat.saying='meow';

 

数组的长度length:length的属性值时这个数组的最大整数属性名+1,它不一定等于数组里的属性个数。arr[100001]=true; arr.length//100002

设置更大的length不会为数组分配更多的空间,设置更小的length会把>=新length的属性删除。

for in遍历无法保证顺序,而且在原型上加扩展方法会被for in出来。所以最好用hasOwnProperty()判断。

//    var arr={
    //        3:1,
    //        42:2,
    //        11:3
    //    }
    //    for(var key in arr){
    //        console.log(arr[key]);
    //    }
    Object.prototype.say='hello';
    var arr={
        "name":"zyy"
    }
    for(var key in arr){
        console.log(key+' '+arr[key]);
    }

判断是否是数组:

var is_arr=function(value){
 return value&&typeof value==='object'&&value.constructor===Array;
}

array.concat(item):包含一份array的浅拷贝并把参数附加其后。【不会修改array】

array.join(分隔符):先把array中每个元素构造成一个字符串,然后用分隔符把他们连接在一起。【速度比+更快】

array.pop():移除最后一个元素并返回,如果为空返回undefined。

array.push(item...):把参数附加到数组尾部【会修改array】

array.reverse():反转array里元素顺序,并返回array本身。

array.shift():移除数组第1个元素,并返回删除元素。如果空返回undefined。

array.slice(start,end):对array中的一段做浅拷贝,end可选。可以是负数。

array.sort():在比较时候会自动转为字符串类型,sort根据不同浏览器稳定性不一样。

array.splice(start,deleteCount,item...):

array.unshift(item...):把元素添加到数组头部。返回新length

 

number.toExponential():把number转成一个指数形式的字符串。

number.toFixed():转换成十进制形式的字符串。

number.toPrecision():

number.toString()

 

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

 

string.charAt(pos):返回在pos处的字符,返回的是个字符串。如果0<pos<string.length,返回空字符串

string.charCodeAt(pos):返回pos处的字符码位,如果0<pos<string.length,返回NaN

string.concat(string...):拼接字符串

string.indexOf(SearchString,pos):在string字符串查找searchString,返回匹配第一个字符的位置。pos可选。

string.lastIndexOf():类似

string.replace(searchValue,replaceValue):对string进行查找和替换,返回一个新字符串。

string.slice(start,end):同array

string.split(separator,limit):把string分割成片段创建一个字符串数组。limit限制被分割的片段数量。

string.toLowerCase():全小写

string.toUpperCase():全大写。

 

NaN===NaN返回false

NaN!==NaN返回true

 

 

==和!=如果两个运算数是不同的类型,它们就会试图转换值的类型。

'' == '0'  //false
0 == ''    //true
false == 'false'  //false
false == '0'    //true
false == undefined  //false
false == null //false
null == undefined //true
' \t\r\n ' == 0  //true