js容易被忽略的内容(一)

  • JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。所以作用域顶端是从“内”部开始的。
  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值