-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
js笔记收录(1) #6
Comments
delete操作符只能对实例的属性和方法有效,对原型上的属性和方法删除无效es5引入了几个方法来防止对对象的修改:
//防止扩展
var person = {name:'nico'}
Object.preventExtensions(person);
console.log(Object.isExtensible(person)); //false
person.age = 22; //正常情况下,悄悄失败,严格模式下会抛出错误
//密封
Object.seal(person);
console.log(Object.isExtensible(person)); //false
console.log(Object.isSealed(person)); //true
delete person.name; //正常情况下,悄悄失败,严格模式下会抛出错误
person.age = 22; //同上
//冻结
Object.freeze(person);
console.log(Object.isExtensible(person)); //false
console.log(Object.isSealed(person)); //true
console.log(Ojbect.isFrozen(person)); //true
person.name = 'welcome'; //正常情况下,悄悄失败,严格模式下会抛出错误
person.age = 22; //同上
delete person.name; //同上 |
var name = 'some';
var adding = {
name: 'adding',
say: function(){ alert('I\'m ' + this.name); }
};
adding.say(); //I'm adding
setTimeout(adding.say, 1000); //I'm some
setInterval(adding.say, 1000); //I'm some
setTimeout(function(){
adding.say(); //I'm adding
}, 1000);
setInterval(function(){
adding.say(); //I'm adding
}, 1000); 2在setTimeout中传入的不是函数时,this则指向当前对象; var name = 'some';
var adding = {
name: 'adding',
say: function(){ setTimeout(console.log('i\'m ' + this.name), 1000); }
};
adding.say(); // i'm adding
var adding = {
name: 'adding',
say: function(){ setTimeout(function(){
console.log('i\'m ' + this.name);
},1000)
}
};
adding.say(); // i'm some 可以通过保存this值或bind方法来得到我们期望的this setTimeout/setInterval方法的第三个参数及之后的参数都作为function函数的参数 var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);
var timeoutID = scope.setTimeout(function[, delay]);
var timeoutID = scope.setTimeout(code[, delay]); |
避免使用空位数组 |
attribute & property
<body id="test" something="non-standard">
<script>
alert(document.body.id); // test
// non-standard attribute does not yield a property
alert(document.body.something); // undefined
</script>
</body> 对于标准的html特性的更新,对应的dom获取的 <input>
<script>
let input = document.querySelector('input');
// attribute => property
input.setAttribute('id', 'id');
alert(input.id); // id (updated)
// property => attribute
input.id = 'newId';
alert(input.getAttribute('id')); // newId (updated)
</script> But, <input>
<script>
let input = document.querySelector('input');
// attribute => property
input.setAttribute('value', 'text');
alert(input.value); // text
// NOT property => attribute
input.value = 'newValue';
alert(input.getAttribute('value')); // text (not updated!)
</script> 对于一些非标准的 <div id="order" class="order" data-order-state="new">
A new order.
</div>
<script>
// read
alert(order.dataset.orderState); // new
// modify
order.dataset.orderState = "pending"; // (*)
</script> |
javascript 运算符的优先级
|
相等(==)深入解析The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:
|
一直想整理关于js的一些特殊方法,eg:call/apply/slice/splice/substr...
call/apply
call/apply:可以简单理解为调用/应用,属于
Function.prototype
的一个方法,所以每个Function
对象实例都有call/apply
属性,两者作用效果是相同的,只是用法不同foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3)
this
表示执行foo
方法的上下文相关对象arg1,arg2,arg3
表示传递给foo
方法的参数使用
apply
时,把参数当做一个整理传递;而使用call
时,把参数分开,一个一个地传递;call/apply:表示在指定作用域中执行调用函数(函数已执行)
bind: 表示给调用函数指定作用域(函数未执行)
callee/caller
FunctionName.caller
,指向调用当前函数的函数的引用callee
根据callee的定义,可以看出来callee是arguments对象的一个属性,指向arguments对象的函数,这个函数就是test(test=arguments.callee)
caller
函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a),所以结果就是弹出
function a(){ b();}
;splice
可以表示截取、替换、删除的意思,这里指数组。该方法会改变原始数组。
splice
是一个全能型的方法,通过参数的个数来实现不同的操作。arr.splice(2,1)
表示从数组下标为2开始向后删除一项,即删除下标为2的指定项arr.splice(2,0,'add1','add2')
表示从数组下标为2的指定项后面添加,第二个参数必须为0arr.splice(2,1,'replace')
表示从数组下标为2的指定项开始,后面的第一个指定项替换为replace
字符串slice/substr/substring
都表示截取的意思
slice(i,[j])
既可以表示字符串截取也可以表示数组截取,不改变原始内容,返回结果为从i
到j
指定的内容,如果没有j
,表示从i
到末尾substr(start,length)
表示字符串截取,不改变原始内容,如果没有第二个参数,表示截取到内容末尾substring(start,end)
表示字符串截取,不改变原始内容,如果没有第二个参数,表示截取到内容末尾push/pop/shift/unshift
这几个方法构成数据结构的堆栈和队列;
push()
从末尾追加数据,pop()
从末尾输出数据,shift()
从头部弹出数据,unshift()
从头部追加数据。The text was updated successfully, but these errors were encountered: