javascript笔记

javascript标准参考教程:http://javascript.ruanyifeng.com/
学习JavaScript参考博客:http://www.cnblogs.com/jikey/p/4039740.html
前端JavaScript规范:http://www.imooc.com/article/1402
经典前端JS面试题:http://www.devtoutiao.com/t?url=http://www.cnblogs.com/xxcanghai/p/5189353.html
javascript中最常用的55个技巧:http://bbs.html5cn.org/thread-84006-1-1.html
45个实用的JavaScript 技巧、窍门和最佳实践:http://segmentfault.com/a/1190000000373875
javascript代码规范:http://www.html5cn.org/article-7538-1.html
JavaScript 开发者经常忽略或误用的七个基础知识点:http://bbs.html5cn.org/thread-79544-1-1.html
javascript验证函数大全:http://bbs.html5cn.org/thread-84817-1-1.html
Javascript常用方法函数收集:http://www.imooc.com/article/1237        http://www.imooc.com/article/1242
javascript迷你库:http://www.imooc.com/article/3171
 

1.任何数值除以0都会返回NaN,任何涉及NaN的操作都会返回NaN,其次NaN与任何值都不想等,包括NaN本身(实际上只有0除以0才会返回NaN,正数除以0返回Infinity,负数除以0返回-Infinity)

2.isNaN()函数是检测参数是否“不是数值”,它会尝试将这个值转换为数值,而且某些不是数值的值会直接转换为数值,如“10”。

3.在应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值。

4.利用逻辑或的这一行为来避免为变量赋null或undefined值。如:
var myObject=aObject||bObject;前者中包含优先赋给变量myObject的值,后者负责在前者中不包含有效值的情况下提供后备值。

5.任何操作数与NaN比较时,比较操作的结果都返回false。

6.在变量声明后并未赋值的情况下,函数声明优先级高于变量声明。即函数声明会覆盖变量声明,但不会覆盖变量赋值。

7.ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的没一个参数。

8.JavaScript没有块级作用域,只支持函数作用域。所以由for语句、if语句创建的变量即使在for循环、if条件执行结束后,也依旧会存在于外部的执行环境中。但在函数中,局部变量只能是局部变量,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。

9.如果局部环境中存在着同名标识符,就不会使用位于父环境中的标识符,即局部变量会覆盖全局变量。

10.sort()方法按升序排列数组项,为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。(如果要比较按数值大小进行排序,则可以创建一个比较函数compare,然后调用sort(compare)方法。对于数值类型,可以使用一个更简单的函数,这个函数只要用第二个值减第一个值即可。)

11.在使用函数表达式定义函数时,没有必要使用函数名,通过变量名即可引用函数,注意函数末尾有一个分号,就像声明其他变量时一样。

12.需要清楚您需要删除的元素,以及它的父元素,即要删除子元素必须先找到父元素。常用的解决方案:找到您希望删除的子元素,然后使用其 parentNode 属性来找到父元素。

13.如果函数调用前使用了 new 关键字, 则是调用了构造函数。这看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象。

14.要使用 clearInterval(timer) 和clearTimeout(timer)方法, 在创建计时方法时你必须使用全局变量timer或者给当前元素添加一个timer属性,例如this.timer(这种方式更有效)。

15.在一个函数中会用到全局对象存储为局部变量来减少全局查找,因为访问局部变量的速度要比访问全局变量的速度更快些。

16.函数开始位置集中做函数声明是一个极力推荐的做法。

17.js中所有用.来获取的属性全部可以用[""]来代替。

18.json格式的数据用for(var i in json)来循环获取。

19.显式类型转换(也是强制类型转换):parseInt()和parseFloat()。parseInt在解析整数之前会强迫将第一个参数解析成字符串。
隐式类型转换:(1)双等号是先转换类型,再比较;全等号不转换类型,直接比较。(2)减法:只有数字相减这一种用途。

20.与 slice()和substr()方法不同的是,substring()不接受负的参数,而且substr()在ECMAscript中没有对该方法进行标准化,因此反对使用它。

21.Math.floor(Math.random()*(n-m+1)+m) ,[m,n] 闭合区间的随机整数。

22.外部js文件或css文件带参数,是为了避免旧的浏览器缓存继续生效;特别是在大型站中随时可能会更改局部css文件,为了避免浏览器刷新而继续使用旧的CSS缓存文件,在使用时往往会带上一个动态参数。

23.js判断为整数的方式:使用Math.floor判断整数取整后还是等于自己,利用这个特性来判断是否是整数。例子:function isInteger(obj) {
return Math.floor(obj) === obj
}
isInteger(3); // true
24.alert(a);// 返回值undefined 
var a=1; 
alert(a);// 返回值1 
由于变量声明是在预编译期被处理的,所以在执行期间对于所有代码来说,都是可见的。但是,你也会看到,执行上面代码,提示的值是undefined,而不是1。这是因为,变量初始化过程发生在执行期,而不是预编译期。在执行期,JavaScript解释器是按着代码先后顺序进行解析的,如果在前面代码行中没有为变量赋值,则JavaScript解释器会使用默认值undefined。由于在第二行中为变量a赋值了,所以在第三行代码中会提示变量a的值为1,而不是undefined。
同理:f(); // 调用函数,返回值1 
function f(){ 
alert(1); 
} 

f(); // 调用函数,返回语法错误(缺少对象) 
var f= function(){ 
alert(1); 
} 
25.arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。
参考博客:http://www.cnblogs.com/lwbqqyumidi/archive/2012/12/03/2799833.html
26.实现JS函数的“重载”:http://www.jb51.net/article/1081.htm http://www.jb51.net/article/42403.htm
27.js不提供replaceAll方法,用for循环又有效率问题,用正则表达式的解决方案:
String.prototype.replaceAll = function(s1,s2){
  return this.replace(new RegExp(s1,"gm"),s2);
};
28.JavaScript 字符串与数字的相互转换: 
http://blog.163.com/hongshaoguoguo@126/blog/static/1804698120138844251327/
29.一元加可以快速将字符串的数字转换为数学数字,即
var number = "23"; 
typeof(number) // string
typeof(+number) // number

可以将时间对象转为时间戳
new Date // Tue May 12 2015 22:21:33 GMT+0800 (CST)
+new Date // 1431440459887

30.格式化date:

var temp = new Date();
var regex = ///g;
(temp.toLocaleDateString() + ' ' + temp.toLocaleTimeString().slice(2)).replace(regex,'-');// "2015-5-7 9:04:10"

31.//构造函数创建

function Person(name,age){ //所有构造函数对象都是Object
this.name=name;
this.age=age;
this.run=function(){
return this.name+this.age+"ing...";
};
}
var person1 = new Person('zhu1',100);
var person2 = new Person('zhu2',200);
alert(person1.run());
alert(person2.run());

alert(person1 instanceof Object); //ture
alert(typeof person2); //Person
alert(person2 instanceof Person); // true
var person3 = {};
Person.call(person3,'zhu3',300);//对象冒充,person3是Object类型,冒充Person类型
alert(person3.run());

32.当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。参考地址:http://www.imooc.com/article/3408

<html>
<body>
    <ul id="list"></ul>
</body>
</html>
</script>
(function(document){
    var viewport;
    var obj = {
        init:function(id){
           viewport = document.querySelector("#"+id);
        },
        addChild:function(child){
            viewport.appendChild(child);
        },
        removeChild:function(child){
            viewport.removeChild(child);
        }
    };
    window.jView = obj;
})(document);

var node = document.createElement("LI");
var textnode = document.createTextNode("Water");
node.appendChild(textnode);

jView.init("list");
jView.addChild(node);
</script>

33.如果x与两侧整数同等接近,则结果接近 +∞方向的数字值 。(如 -5.5 将舍入为 -5; -5.52 将舍入为 -6)

34.splice() 方法与 slice() 方法的作用是不同的,splice()方法会直接对数组进行修改,而slice()方法并不会修改数组,而是返回一个子数组。

35.判断是否为IE6/7/8:

// 貌似是最短的,利用IE不支持标准的ECMAscript中数组末逗号忽略的机制
var ie = !-[1,];
// 利用了IE的条件注释
var ie = /*@cc_on!@*/false;
// 还是条件注释
var ie//@cc_on=1;
// IE不支持垂直制表符
var ie = 'v'=='v';
// 原理同上
var ie = !+"v1";

alert(ie);

36.instanceof检测原始类型时均返回false,它只能检测引用类型的实例。如:var name = "Pomy";console.log(name instanceof String); //false

37.JavaScript删除数组重复元素的5个高效算法:http://www.html5cn.org/article-8656-1.html

38.变量提升指的是,无论是哪里的变量在一个范围内声明的,那么JavaScript引擎会将这个声明移到范围的顶部。

39.js获取url参数的方法:

function getUrlParam(name) {

  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
  var r = window.location.search.substr(1).match(reg); //匹配目标参数
  if (r != null) return unescape(r[2]); return null; //返回参数值
}

40.this 上下文只存在两种语义,一种是被当作方法调用,this 指向调用它的对象;一种是作为函数调用,指向 Global 对象(严格模式下为 undefined)。

41.Object.toString()检测对象类型:

// 检测数组类型
function isArray(value){
    return Object.prototype.toString.call(value) == "[object Array]"  
}

// 检测函数
function isFunction(value){
    return Object.prototype.toString.call(value) == "[object Function]"  
}

// 检测正则表达式
function isRegExp(value){
    return Object.prototype.toString.call(value) == "[object RegExp]"  
}

42.new操作的过程如下:
(1)创建一个空对象{},并将this指向该空对象;
(2)将this的__proto__指向构造函数的prototype;
(3)执行构造函数,如果构造函数返回值为对象,那么就返回该对象;如果构造函数没有显式返回值或者返回值为基本数据类型,那么直接忽略这些返回值,而是返回this。

41.js判断类型
function isType(type){
    return function(o){
        return Object.prototype.toString.call(o) === '[object ' + type + ']';
    };
}

var isString = isType("String");
var isArray = isType("Array");
var isObject = isType("Object");

console.log(isString("I'm Barret Lee."));
console.log(isArray([1,2,3]));
console.log(isObject({}));
原文地址:https://www.cnblogs.com/gyx19930120/p/4419843.html