js基础总结
基础
普通---立即执行
async---异步加载,立即执行,不按照顺序执行
defer---异步加载,最后执行
<noscript>
数据类型
number
NaN---未知的数值 通过inNaN(判断是否能转化为数值)来判断
infinity
指数形式:aE+n a乘10的n次方,11E-3 ===> 11*10^-3 = 0.011
undefined---未定义
null---空对象指针
string
boolean
object
typeof操作符:undefined boolead string number object(null) function
基本转义字符 \n换行,\b空格
控制结构
1.do-while
先执行,再判断
2.while
判断再执行
3.for
---都是为假就跳出循环
4.for-in-迭代读取对象的key,可能不会按照顺序读取...
5.label,break,continue
6.with---将代码的作用域设定到特定对象中
with(a){
var x=b;
var y=c;
}---将作用域设定到a对象中;
等同于
var x=a.b;
var y=a.c;
7.switch
case x : 语句;break;
default: 语句;
变量,作用域和内存
变量类型:
基本类型---简单数据段
引用类型---对象类
1.对于直接赋值 a=b
基本类型传递值
引用类型传递指针,所以改变b,a会改变;
2.对于向函数传递参数
都是传递值;
执行环境及作用域
function a(){
function b(){
}
}
环境栈: ↓
b的环境对象---活动对象,包括arguments变量
a的环境对象---第二级作用域
window---全局作用域
引用类型
通过new或者字面量的形式创建
公共方法:
tostring()
tolocalstring()
valueof()
引用类型包括以下几类:
1.object
2.array
3.date
获得时间
var now = new Date;
然后通过getTime()等方法
创建时间
var dateTime = new Date("2016/05/20 23:42:00");
4.RegExp
5.Function
6.包装类型-boolean,string,number
---
var a='xx';
var b=a.length; b=2;
相当于:
var a='xx';
a1=new string('xx');
b=a1.length;
a1=null;
基本数据类型能使用方法,是因为转换成了这些包装类型,然后立即被释放;
a.color='red';---a变成包装类型string,添加属性color,然后被释放
alert(a.color);---undefined,又变成了基本类型.
---
var value='1';
Number(value);---转换函数,转成数值
new Number(value);---构造函数,构造了一个包装类型
7.单体内置对象
Global
全局对象---最底层的对象---没有直接调用的方法,只有通过window对象调用
window对象是Global(js语法中的最底层对象)与浏览器对象之和;
Math
面向对象
对于一个属性--由一个name,6个特性组成;
可配置性 configurable ---能否delete删除;能否修改特效;能否设置为访问器属性;
可枚举性 enumerable---能否for-in
数据属性:
可修改性 writable
数值 value---默认undefined
访问器属性:(es5标准,ie8及以下没有--主要 适用与移动端);
set
get
前三个特性,默认true,但是如果开始设置,任意一个特性,其余的默认false;
数据属性和访问器属性不能混用;
var a = {};
Object.defineProperty(a,"name",{
value:"lh",
writable:false --- 这个时候,其余两个属性设置为了false;
})
var b = Object.getOwnPropertyDescriptor(a,"name");
得到特性名=>值组成的对象;
Object.defineProperty(a,"name",{
set:function(e){
this.name=e+1;
}
设置多个属性
Object.defineProperties(a,{
name:{},
vale:{}
})
Object模式
var x = new Object()
x.name='';
...
对象字面量
var x = {
name:'',
...
}
工厂模式
function x (){
var o = new Object();
o.name='';
...;
return o;
}
构造函数
function x(){
this.name='';
}
var y =new x ();
除了构造函数,这几种方法原型链都是
对象--对象原型(Object.prototype)--null
构造函数是
实例化的对象(y)--实例原型(y.__proto__/x.prototype)--对象原型(Object.prototype)--null
function a(){
this.fn=function(){}
}---构造函数a中创建一个方法fn;
var b1 = new a();
var b2 = new a();
这个时候 b1.fn并不等于b2.fn;
要他们共用一个方法,要将方法放在原型a上;
a.prototype.fn = function(){...};
----------------------------------------
实际使用:
function student(){
this.name=prop.name||"匿名";
};
student.prototype.fn=function(){...};
function createstudent(prop){
return new student(prop||{});
}
---然后直接用 var xiaoming = createstudent();来创建
1.不要new
2.传参数不用管顺序,和有没有,还能设置默认值...
3.完全匹配json数据;
var x = createstudent({
"name":"xiaoming",
...
})
function mor(obj) {
var rs = [];
while(obj) {
rs.push(obj);
obj = Object.getPrototypeOf(obj);
}
return rs;
}
原型上的变量,实例中赋值后,变成不继承了??--继承,但是优先级不同
q.hasOwnProperty("vv") true
w.hasOwnProperty("vv") flase --
在q中添加了vv属性,因为调用是从上至下的,所以现在实例中查找,再去原型--
可以通过delete q.vv;然后调用的又是原型中的了.
function empty(){};??
实例a 构造函数b 原型c
---------------------------------------------------------------------------------------------
constructor b functon Function(){} b
-----------------------------------------------------------------------------------------------
prototype undefine c undefine
-----------------------------------------------------------------------------------------------
__proto__ c function Empty(){} Object
-----------------------------------------------------------------------------------------------
__proto__才是原型,继承.
定义函数时,就会有construct和prototype出现
函数的原型是个空对象,继承自Object;
new的作用是将this绑定?
------------------------------------------------------------------------------------------------
构造函数模式+原型模式实际运用
var prop = {
name:"gou",
cat:"miao"
}
function a(){
this.cat=prop.cat||'mao'
};
a.prototype={
constructor:a,
建立对象的时候,设置原型的时候.只能单个设置
eg:
a.prototype.name:'="name',
say:function(){
return this.say+this.name;
}
}
function createA(){
return new a (prop||{})
}
var b = createA(prop);
稳妥构造模式
function a (){
var o = new Object();
name="xx";
o.sayname=function(){
alert(name);
}
return o;
}
适应在需要安全的地方--除了o.sayname方法,无法访问内部属性;
函数
闭包:
能访问函数内部.
匿名函数的返回---
function a(x){
var t='he';
console.info(x);
return function (x){
console.info(t,x,this);
}
}
var b=a('he');---'he',b=function(){...};this指向windows,但是环境仍然为a;
能访问到t,x又作为匿名函数的参数了,所以如b不赋值,则为undefined;
b('he');---'he,he,window';
严格模式下,不能使用arguments.callee;
var a = (function b(){})---用来内部调用自己;
闭包用途:
function a(){
var x=1;
add=function(t){
x=x+t;
console.info(x);
};
return function b(){
x++;
console.info(x);
};
}
var b=a();
b();2
b();3
add(1);5
---通过闭包,b函数赋予给全局变量b,b函数又依赖a,所以将a环境一直保存在内存中了...
add没用var创建,所以是个能访问a内部的全局函数,可以用来设置a内的变量;
其他
错误处理
所以抛出的错误都是error对象的实例
error对象:
message:错误提示信息
name:错误名称(非标准属性)
stack:错误的堆栈(非标准属性)
派生的六种对象
1.syntaxError---语法错误
2.refrenceError---引用了不存在的变量
3.rangeError---超出范围
4.typeError---使用变量或参数不是预期类型
5.URIError---URI相关函数的参数不正确
6.EvalError---Eval函数没有正确执行
自定义错误:
function a(){}
a.prototype=new Error;
a.contructor=a;
var b=new a;
throw语法
throw抛出一个对象,然后中断
try{}
catch(){}
finally{}
执行try中的语句,如果完成,执行finally语句
如果错误,catch捕获错误(不抛出错误),然后执行catch语句,再finally语句
常用操作符与方法汇总
操作符
typeof---主要检测基本类型
instanceof---主要检测引用类型 检测对象的cunstructor
1.Object
实例 instanceof 原型
Object.getPrototypeOf() 获得对象的原型
Object.constructor 对象的构造函数
Object.hasOwnProperty( ) 检查属性是否被继承
Object.isPrototypeOf(a) 一个对象是否是另一个对象的原型 (a原型链上是否有Object);
Object.propertyIsEnumerable( ) 是否可以通过for/in循环看到属性
Object.toLocaleString( ) 返回对象的本地字符串表示
Object.toString( ) 定义一个对象的字符串表示
Object.valueOf( ) 指定对象的原始值
2.Array
Array.concat( ) 连接数组
Array.join( ) 将数组元素连接起来以构建一个字符串
Array.length 数组的大小
Array.pop( ) 删除并返回数组的最后一个元素
Array.push( ) 给数组添加元素
Array.reverse( ) 颠倒数组中元素的顺序
Array.shift( ) 将元素移出数组
Array.slice( ) 返回数组的一部分
Array.sort( ) 对数组元素进行排序
Array.splice( ) 插入、删除或替换数组的元素
Array.toLocaleString( ) 把数组转换成局部字符串
Array.toString( ) 将数组转换成一个字符串
Array.unshift( ) 在数组头部插入一个元素
Array.
3.Boolean
Boolean.toString( ) 将布尔值转换成字符串
Boolean.valueOf( ) Boolean对象的布尔值
4.Function
Function.apply( ) 将函数作为一个对象的方法调用
Function.arguments[] 传递给函数的参数
Function.call( ) 将函数作为对象的方法调用
Function.caller 调用当前函数的函数
Function.length 已声明的参数的个数
Function.prototype 对象类的原型
Function.toString( ) 把函数转换成字符串
5.Number
Number.MAX_VALUE 最大数值
Number.MIN_VALUE 最小数值
Number.NaN 特殊的非数字值
Number.toLocaleString( ) 把数字转换成本地格式的字符串
Number.toPrecision( ) 格式化数字的有效位
Number.toString( ) 将—个数字转换成字符串
Number.valueOf( ) 返回原始数值
6.String(字符串对象)
String.charAt( ) 返回字符串中的第n个字符
String.charCodeAt( ) 返回字符串中的第n个字符的代码
String.concat( ) 连接字符串
String.indexOf( ) 检索字符串
String.lastIndexOf( ) 从后向前检索一个字符串
String.length 字符串的长度
String.localeCompare( ) 用本地特定的顺序来比较两个字符串
String.slice( ) 抽取一个子串
String.split( ) 将字符串分割成字符串数组
String.substr( ) 抽取一个子串
String.substring( ) 返回字符串的一个子串
String.toLocaleLowerCase( ) 把字符串转换小写
String.toLocaleUpperCase( ) 将字符串转换成大写
String.toLowerCase( ) 将字符串转换成小写
String.toString( ) 返回字符串
String.toUpperCase( ) 将字符串转换成大写
String.valueOf( ) 返回字符串
7.其他
parseInt(x,16/10/8) --- 如果x=08 有没有指定radix 那就会输出8进制
parseFloat(x,16/10/8)
isNaN()
isFinite() 检测是不是infinity与NaN
escape() 对整个字符串进行转义 (% ? 等在url中有意义的也会被转义)
encodeURI() 对URL进行转义(只会对参数) --- decode...反转义
encodeURIComponent() 对整个url转义(当url作为参数时,如跳转)