与其说复习,不如说重新学习。这里记录一下学习过程中想要记录的东西,以便于以后温习。
ECMAScript原始数据类型:String、Number、Boolean、Undefined、Null
对变量或者值调用typeof运算符将返回下列值之一:
undefined - 如果变量是Undefined类型的
string - 如果变量是String类型的
number - 如果变量是Number类型的
boolean - 如果变量是Boolean类型的
object - 如果变量是一种引用类型或Null类型
function-如果变量是一个函数
ECMAScript运算符
一元运算符
delete 只能删除开发者定义的属性和方法,不能删除ECMAScript的原始方法,例如toString()
var o={name:"minnie",age:8}; alert(o.name);//输出minnie; delete o.name alert(o.name);//输出undefined;
void 运算符对任何值返回undefined。该运算符通常用于避免输出不应该输出的值。例如
<a href="javascript:window.open(‘about:blank‘)">click me</a>
当在页面点击"click me"时,即可看到屏幕上显示【object】,使用
<a href="javascript:void(window.open(‘about:blank‘))">click me</a>
void使window.open()返回undefined,undefined不是有效值,不会显示在浏览器窗口。
注:高版本浏览器并未出现【object】情况
前增量/前减量运算符 ++/--运算符
加减执行在计算表达式之前,所以在执行表达式的时候已经加减过,所以表达式的值和参数的值一致。
javascript语言的特殊之处:
1.函数内部可以直接读取全局变量
2.函数内部声明变量必须用var,否则声明的是一个全局变量(全局变量声明可以不用 var)
闭包的最大优点:
1.在函数外部访问函数内部的变量
2.让这些变量的值始终保持在内存中
闭包的缺点:
1.闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2.闭包会在父函数外部改变函数内部变量的值。所以,如果把父函数当做对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。
闭包陷阱一:
function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } var funcs = createFunctions(); for (var i=0; i < funcs.length; i++){ console.log(funcs[i]()); }
乍一看,以为输出0-9,其实输出10个10;这里的陷阱就是函数带()才是执行函数
总结:闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收;不必要的引用(闭包)就是徒增内存消耗。
javascript的原型(原型链和作用域链)
一切(引用类型)都是对象,对象是属性的集合。
------------------------------------------------------------------------------------------------------------------
==和===的区别
== 等于(值) 会将引用类型转换为基本类型做比较
使用==进行比较的时候,如果是引用类型会先转为基本类型,对象转换为基本类型时默认先使用valueOf转,再使用toString()转,Date先使用toString()转。如下代码测试:
var x = ""; var obj = {toString : function(){x="toString";return 0},valueOf : function(){x="valueOf";return 0}}; console.log(obj==0,x);//true,"valueOf" var x = ""; var obj = {toString : function(){x="toString";return 0}}; console.log(obj==0,x);//true,"toString"
使用==比较也可能有副作用,甚至会产生异常
var x = ""; var obj = {toString : function(){x="toString";return {}}}; console.log(obj==0,x);//Uncaught TypeError:Cannot convert object to primitive value
=== 全等(值和类型)
----------------------------------------------------------------------------------------------------
__proto__
每个对象都有一个__proto__属性,指向创建该对象的函数的prototype.
------------------------------------------------------------------------------------------------------
instanceof 运算符
判断规则:
A instanceof B (个人理解为:判断A是否指向B的原型。A(对象有一个隐藏属性__proto__)B(函数有一个默认属性prototype))
A--对象 B--函数
instanceof判断规则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即是同一个对象,那么就返回true;如果找到重点还未重合,则返回false。
例如:
console.log(Object instanceof Function);//true //Object.__proto__ === Function.prototype console.log(Function instanceof Object);//true //Function.__proto === Function.prototype === Function.prototype.__proto__ === Object.prototype; console.log(Function instanceof Function);//true //Function.__proto__ === Function.protorype
总结:instanceof表示的就是一种继承关系,或者原型链的结构
函数是一种对象,对象由函数生成。
--------------------------------------------------------------------------------------------------------
Object.prototype.hasOwnProperty
所有对象都有Object.prototype的方法,所有函数都有call,apply方法,都有length,arguments,caller等属性。
-------------------------------------------------------------------------------------------------------
in运算符
prop in Object 指定属性(只能是属性名,数组只能是索引值)存在于指定对象中
使用delete运算符删除一个属性,则in运算符对所删除属性返回false:
var str = {"name":"minnie","age":8,"class":"xiaoxue"}; delete str.class; "class" in str;//false;
将属性赋值为undefined,则in运算符依然返回true.
var str = {"name":"minnie","age":8,"class":"xiaoxue"}; str.class = undefined; "class" in str;//true
如果属性是从原型链上继承的,in运算符也会返回true
"toString" in {};//true
变量、函数声明、函数表达式
javascript在执行一个代码段之前,会先有准备工作,然后才是代码的执行。这个“代码段”分为三种情况--全局、函数、eval
准备工作:
1.变量的声明
2.函数表达式上的变量声明 默认赋值为undefined
3.this赋值
4.函数声明--赋值
这些步骤组成了“执行上下文”或者“执行上下文环境”