1.在javascript中使用 == 比较,会自动转换数据类型再比较,有时候会 得到非常诡异的结果;一般情况下使用 === 比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较
2.特殊的Number NaN 与所有其他值都不相等,包括自己。 唯一判断NaN方法是通过 isNaN()函数
3.浮点数相比较(因为浮点数在运算过程中会产生误差,极端及不能精确表示无限不循环小数。要比较两个浮点数是否相等,只能计算它们之间的差的绝对值,看是否小于某个阈值)
例:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
4.null
表示一个“空”的值,它和0
以及空字符串''
不同,0
是一个数值,''
表示长度为0的字符串,而null
表示“空”。undefined
表示值未定义。区别两者的意义不大,大多数情况下,我们都应该用null
。undefined
仅仅在判断函数参数是否传递的情况下有用。
5.对象
var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};
xiaohong
的属性名middle-school
不是一个有效的变量,就需要用''
括起来。访问这个属性也无法使用.
操作符,必须用['xxx']
来访问:
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'
6.
使用iterable
内置的forEach
方法,它接收一个函数,每次迭代就自动回调该函数。以Array
为例:
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
alert(element);
});
7.调用函数的时候,传入参数多的情况下没有问题
传入参数少的时候,没传但用到的参数就会收到 undefined,计算结果为NaN
如果要避免收到undefined可以对参数进行检查:
function abs(x) {
if (typeof x !== 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
8.注意return语句
function foo() {
return { name: 'foo' };
}
foo(); // { name: 'foo' }
如果把return语句拆成两行:
function foo() {
return
{ name: 'foo' };
}
foo(); // undefined
要小心了,由于JavaScript引擎在行末自动添加分号的机制,上面的代码实际上变成了:
function foo() {
return; // 自动添加了分号,相当于return undefined;
{ name: 'foo' }; // 这行语句已经没法执行到了
}
所以正确的多行写法是:
function foo() {
return { // 这里不会自动加分号,因为{表示语句尚未结束
name: 'foo'
};
}
9.
javascript的函数可以嵌套,内部的函数可以访问外部的函数定义的变量,反之不行
如果内部函数和外部函数的变量重名的话,javascript的函数在查找变量时从自身函数定义开始,从内向外查找,如果内部函数定义了与外部函数重名的变量,则内部函数的变量将屏蔽外部函数的变量
10.javascript会扫描整个函数体的语句,把所有声明的变量提升到函数顶部,但不会提升变量的赋值
11.
Array的sort()方法默认把所有的元素先转换为String 再排序
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]
'10'排在'2'的前面,因为'1'比字符'2'的ASCII码小
sort()方法会直接对Array进行修改,返回的结果是当前的Array
12.typeof操作符获取对象的类型
13.包装对象,使用new创建
var n = new Number(123); // 123,生成了新的包装类型
var b = new Boolean(true); // true,生成了新的包装类型
var s = new String('str'); // 'str',生成了新的包装类型
14.
var n = Number('123'); // 123,相当于parseInt()或parseFloat()
typeof n; // 'number'
var b = Boolean('true'); // true
typeof b; // 'boolean'
var b2 = Boolean('false'); // true! 'false'字符串转换结果为true!因为它是非空字符串!
var b3 = Boolean(''); // false
var s = String(123.45); // '123.45'
typeof s; // 'string'
15.
Array
要使用Array.isArray(arr)
;
null
请使用myVar === null
;
typeof window.myVar === 'undefined'
;
typeof myVar === 'undefined'
。
16.为了统一解析,JSON的字符串规定必须用双引号""
,Object的键也必须用双引号""
17.将对象序列化成JSON格式的字符串
var xiaoming = {
name: '小明',
age: 14,
gender: true,
height: 1.65,
grade: null,
'middle-school': '\"W3C\" Middle School',
skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};
JSON.stringify(xiaoming);
// '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":"\"W3C\" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'
JSON.stringify(xiaoming,null,' ');
第二个参数用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array
:
JSON.stringify(xiaoming, ['name', 'skills'], ' ');
还可以传入一个函数,这样对象的每个键值对都会被函数先处理:
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
JSON.stringify(xiaoming, convert, ' ');
18.使用JSON.parse()将JSON格式的字符串变成一个Javascript对象
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
JSON.parse()
还可以接收一个函数,用来转换解析出的属性:
JSON.parse('{"name":"小明","age":14}', function (key, value) {
// 把number * 2:
if (key === 'name') {
return value + '同学';
}
return value;
}); // Object {name: '小明同学', age: 14}
19.
javascript中ajax的使用
'use strict';
function success(text) { var textarea = document.getElementById('test-response-text'); textarea.value = text; }
function fail(code) { var textarea = document.getElementById('test-response-text'); textarea.value = 'Error code: ' + code; }
var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象
request.onreadystatechange = function () { // 状态发生变化时,函数被回调 if (request.readyState === 4) { // 成功完成 // 判断响应结果: if (request.status === 200) { // 成功,通过responseText拿到响应的文本: return success(request.responseText); } else { // 失败,根据响应码判断失败原因: return fail(request.status); } } else { // HTTP请求还在继续... } }
// 发送请求: request.open('GET', '/api/categories'); request.send();
alert('请求已发送,请等待响应...');
20.AJAX和Promise看不太懂
21.
Canvas除了能绘制基本的形状和文本,还可以实现动画、缩放、各种滤镜和像素转换等高级操作。如果要实现非常复杂的操作,考虑以下优化方案:
<img>
标签并放到最底层
22.
事件的触发总是用户操作引发的,如果用代码去通过改变一些东西意图去触发事件,这是达不到目的的
23.在浏览器中有些javascript代码只有在用户触发下才能执行,例如 window.open()
24.Jquery有的动画如 slideUp()没有效果,这是因为jquery动画的原理是逐渐改变css的值,如:height从100px逐渐变为0,如果元素不是block性质的DOM元素,设置它们的height就不会起作用
25.涉及到异步代码,无法在掉用时捕获异常,原因是在绑定事件的代码处,无法捕获事件处理函数的错误
26.underscore函数库
node.js
27.
如果要输出一个键值对象{}
,可以利用exports
这个已存在的空对象{}
,并继续在上面添加新的键值;
如果要输出一个函数或数组,必须直接对module.exports
对象赋值。
28.process.nextTick(function(){}); //传入的函数不是立即执行,要等到下一次事件循环
Node.js进程本身的事件就由process
对象来处理。如果我们响应exit
事件,就可以在程序即将退出时执行某个回调函数:
// 程序即将退出时的回调函数:
process.on('exit', function (code) {
console.log('about to exit with code: ' + code);
});
29.判断javascript执行环境
if (typeof(window) === 'undefined') {
console.log('node.js');
} else {
console.log('browser');
}