《JavaScript 秘密花园》—一些奇奇怪怪的知识

对象

toString:所有对象都有toString()方法,基本类型除null和undefined外也有
2.toString() 语法错误因为会把 . 当成数字运算,解决办法

2..toString(); // 第二个点号可以正常解析
2 .toString(); // 注意点号前面的空格
(2).toString(); // 2先被计算

默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString()返回 “[object type]”,其中type是对象的类型
第一个object:ecma规范要求toString 方法返回[object class] ,不过大多数内部类覆盖了toString方法,所以只有自定义对象的会返回[object object] ,客户端内建的对象一般class都是为Object(大写) ,虽然很多类覆盖了toString方法,但是我们可以用Object.prototype.toString.apply(o) 显示调用object.toString。

delete obj[属性名]才能删除属性名,该属性设置为null/undefined只是解除与值的关联 。用obj.hasOwnProperty(i)检验

原型属性:可以把任何类型的值赋给它(prototype)。 然而将原子类型赋给 prototype 的操作将会被忽略。

function Foo() {
   }
Foo.prototype = 1; // 无效

hasOwnProperty:hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。

// 修改Object.prototype
Object.prototype.bar = 1; 
var foo = {
   goo: undefined};

foo.bar; // 1
'bar' in foo; // true
for(let i in foo)
// ——这3个都会查找

函数声明

1、将匿名函数赋值给变量

foo; // 'undefined'
foo(); // 出错:TypeError
var foo = function() {
   };

由于 var 定义了一个声明语句,对变量 foo 的解析是在代码运行之前,因此 foo 变量在代码运行时已经被定义过了。

但是由于赋值语句只在运行时执行,因此在相应代码执行之前, foo 的值缺省为 undefined。

命名函数的赋值表达式
2、另外一个特殊的情况是将命名函数赋值给一个变量。

var foo = function bar() {
   
    bar(); // 正常运行
}
bar(); // 出错:ReferenceError

bar 函数声明外是不可见的,这是因为我们已经把函数赋值给了 foo; 然而在 bar 内部依然可见。这是由于 JavaScript 的 命名处理 所致, 函数名在函数内总是可见的。
注意:在IE8及IE8以下版本浏览器bar在外部也是可见的,是因为浏览器对命名函数赋值表达式进行了错误的解析, 解析成两个函数 foo 和 bar

this

函数调用的时候内部this指向window
常见误解:

Foo.method = function() {
   
    function test() {
   
        // this 将会被设置为全局对象(译者注:浏览器环境中也就是 window 对象)
    }
    test();
}

为了在 test 中获取对 Foo 对象的引用,我们需要在 method 函数内部创建一个局部变量指向 Foo 对象。

Foo.method = function() {
   
    var that = this;
    function test() {
   
        // 使用 that 来指向 Foo 对象
    }
    test();
}

函数别名:也就是将一个方法赋值给一个变量。

var test = someObject.methodTest;
test();

上例中,test 就像一个普通的函数被调用;因此,函数内的 this 将不再被指向到 someObject 对象。——指向window(严格模式下是undefined)

function Foo() {
   }
Foo.prototype.method = function() {
   };

function Bar() {
   }
Bar.prototype = Foo.prototype;

new Bar().method();

当 method 被调用时,this 将会指向 Bar 的实例对象。

函数 是 JavaScript 中唯一拥有自身作用域的结构

循环中的闭包:

for(var i = 0; i < 10; i++) {
   
    (function(e) {
   
        setTimeout(function() {
   
            console.log(e);  // 可以打印1-10
        }, 1000);
    })(i);
}

for(var i = 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值