js容易被忽略的内容(一)
2017-04-23 12:07
274 查看
JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。所以作用域顶端是从“内”部开始的。
计算机无法精确表示无限循环小数,所以有误差
唯一能判断NaN的方法是通过isNaN()函数
多数情况,应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
‘use strict’
变量未使用var错误
等号必须要===
在strict模式下函数的this指向undefined
对象:如果属性名包含特殊字符,就必须用单引号(双引号也行,不过json也是双引号,不太好)括起来。访问这个属性也无法使用.操作符,必须用[”]来访问
条件: if () {} else {}
不支持:
隐士转换:
for…in 遍历对象属性
for … in 存在的问题:遍历属性名称,数组的每个元素的索引被视为一个属性,当手动给数组添加额外的属性后
for …each : ES5.1标准引入,注意浏览器是否支持
即使函数没有return语句,函数执行完后也会返回结果,只是结果为undefined。
arguments,只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。即使没定义形参,也可用arguments[i]访问。
申明提升
语句var x = ‘Hello, ’ + y;并不报错,原因是变量y在稍后申明了。但是alert显示Hello, undefined,说明变量y的值为undefined。这正是因为JavaScript引擎自动提升了变量y的声明,但不会提升变量y的赋值。
最常见的做法是用一个var申明函数内部用到的所有变量
apply: 函数本身的apply方法,接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
浮点数误差
1 / 3 === (1 - 2 / 3); // false
计算机无法精确表示无限循环小数,所以有误差
isNaN(NaN); // true
唯一能判断NaN的方法是通过isNaN()函数
多数情况,应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
‘use strict’
变量未使用var错误
等号必须要===
在strict模式下函数的this指向undefined
对象:如果属性名包含特殊字符,就必须用单引号(双引号也行,不过json也是双引号,不太好)括起来。访问这个属性也无法使用.操作符,必须用[”]来访问
var obj = { name: 'liu', 'eat-food': 'food' } console.log(obj['eat-food']) // food // 判断属性是否属于对象,继承了来的也包含在内 console.log('name' in obj) // true console.log('toString' in obj) // true // 判断属性是否属于对象,不包含继承来的 console.log(obj.hasOwnProperty('name')) true console.log(obj.hasOwnProperty('toString')) // false
条件: if () {} else {}
不支持:
if(3<d<7){}支持:
if(d>3 && d<7){}
隐士转换:
null、undefined、0、NaN和空字符串''转化为false,其他为true
for…in 遍历对象属性
var o = { name: 'liu', age: 20, city: 'Beijing' }; for (var key in o) { alert(key); // 'name', 'age', 'city' } // 过滤继承属性 for (var key in o) { if (o.hasOwnProperty(key)) { alert(key); // 'name', 'age', 'city' } }
for … in 存在的问题:遍历属性名称,数组的每个元素的索引被视为一个属性,当手动给数组添加额外的属性后
var a = ['A', 'B', 'C']; a.name = 'Hello'; for (var x in a) { alert(x); // '0', '1', '2', 'name' }
for …each : ES5.1标准引入,注意浏览器是否支持
var a = ['A', 'B', 'C']; a.forEach(function (element, index, array) { // element: 指向当前元素的值 // index: 指向当前索引 // array: 指向Array对象本身 alert(element); });
即使函数没有return语句,函数执行完后也会返回结果,只是结果为undefined。
arguments,只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。即使没定义形参,也可用arguments[i]访问。
function abs() { console.log(arguments[0]); } abs(10); // 10 // 利用arguments实现传入不同参数的执行情况 function foo(a, b, c) { if (arguments.length === 2) { // 实际拿到的参数是a和b,c为undefined c = b; // 把b赋给c b = null; // b变为默认值 } // ... }
申明提升
语句var x = ‘Hello, ’ + y;并不报错,原因是变量y在稍后申明了。但是alert显示Hello, undefined,说明变量y的值为undefined。这正是因为JavaScript引擎自动提升了变量y的声明,但不会提升变量y的赋值。
function foo() { var x = 'Hello, ' + y; alert(x); var y = 'Bob'; } foo()
最常见的做法是用一个var申明函数内部用到的所有变量
function foo() { var x = 1, y = x + 1, z, i; for (i=0; i<100; i++) { ... } }
apply: 函数本身的apply方法,接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
obj.apply(obj1,[]) obj.call(obj1,[]); // apply()把参数打包成Array // call()把参数按顺序传入。 Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, 5, 4); // 5 // 对普通函数调用,我们通常把this绑定为null
// 利用apply(),可以动态改变函数的行为。JavaScript的所有对象都是动态的,即使内置的函数,我们也可以重新指向新的函数. // 统计一下代码一共调用了多少次parseInt() var count = 0; var oldParseInt = parseInt; // 保存原函数 window.parseInt = function () { count += 1; return oldParseInt.apply(null, arguments); // 调用原函数 }; parseInt('10'); // count; // 1
浮点数误差
num = 0.1 + 0.2; // 0.300000000000000004 处理方式: num = (1 + 2) / 10 // 0.3
相关文章推荐
- JS中容易被忽略的基础知识
- return后面如果跟着换行,则js引擎会在换行处填补分号,return后面的内容将被忽略!
- 容易被忽略的JS脚本特性
- 关于JS那些容易被你忽略的那些点(3)
- 一些容易忽略的内容
- js比较大小容易忽略的问题
- JS中容易忽略的、毫无技术性、最不容易发现的错误
- 准备js面试容易被忽略的知识点总结(一)
- js一些容易忽略的细节
- 安卓客户端测试中,那些容易忽略却又非常重要的测试内容
- JS容易被忽略的小知识点
- 那些JS容易忽略的题
- js中容易被忽略的数字类型--Infinity
- 容易被忽略的JS脚本特性
- 7种js容易忽略的写法
- 关于JS那些容易被你忽略的那些点(1)
- 关于JS那些容易被你忽略的那些点(2)
- js 容易忽略的小知识点
- 介绍几个ASP.NET中容易忽略但却很重要的方法函数
- 根据内容自动调整弹出窗口大小的JS解决方案