JS中零星知识点
1.null
typeOf null //object
null是一个空指针,指针是用来指向对象的,因此null的类型返回object
2.undefined
undefined == null //true
undefined 值是派生自null
3.基本类型
var s = 'meituan';s.subString(3); //tuan
3.1简单类型为什么含有方法?
每当读取一个基本类型的时候,后天都会创建一个与之对应的包装类型对象,所以可以调用相应的方法。上述代码过程如下:
创建string类型的一个实例
在实例上调用指定的方法
销毁这个实例
var s1 = new String('meituan');var s2 = s1.subString(3);s1 = null;return s2;
3.2 基本类型和引用类型的不同
主要是生命周期
var s = 'meituan';s.age = 4;console.log(s.age) //undefined
在第二行中,新创建的string对象调用完后立刻被销毁了,所以第三行再次调用时就不存在第二行的对象了。
4.Object.prototype遍历结果为什么显示空?
var list = [];for(var key in Object.name) { list.push(key);}console.log(list) //[]
// Object.prototype无法遍历的原因Object.getOwnPropertyDescriptor(Object.prototype, 'toString')//Object {value: function, writable: true, enumerable: false, configurable: true},cause:enumerable: false
// 查看不可遍历的Object.prototypeconsole.dir(Object.prototype)
5.valueOf和toString的用法
var a = { i: 10, valueOf: function() { return this.i + 30;}, toString: function() { return this.valueOf() + 10;}}alert(aaa > 20) // truealert(+aaa); // 40alert(aaa);// 50
valueOf()主要用于运算符操作,toString()主要用于数据的展示。
调用顺序:
1.如果方法被重写,那么重写的方法优先级最高,直接被调用
2.如果优先级相同,那展示的情况下使用toString,参与操作符运算的时候调用valueOf
6.{}的用法
a)如果{}是在表达式前面,会作为代码块使用
{} + [] // 0equal to+ []
b) 如果放在后面,作为空对象
[] + {} // [object Object]
7.编码—encodeURI encodeURIComponent
var url = 'http://book.2cto.com/201401/39587.html value.jsp'; var a = encodeURI(url); // "http://book.2cto.com/201401/39587.html%20value.jsp" var b = encodeURIComponent(url); //"http%3A%2F%2Fbook.2cto.com%2F201401%2F39587.html%20value.jsp"//二者之间的区别在于编码的范围存在差异,encodeURIComponent的范围更大
与之对应的解码方法是decodeURI、decodeURIComponent
另外escape、unescape已经被ES3废弃掉,不建议使用。
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z.
对整个URI进行解析时,可以使用encodeURI,对URI的部分解析解析时应该使用encodeComponent
前端解析后的参数,传递给后端,后端也有一个类能够解析编码后的参数:URLDecoder http://docs.oracle.com/javase/6/docs/api/java/net/URLDecoder.html
8.正则表达式
全局标志g:会改变regExp的lastIndex值,也就是下一次开始匹配时的起始位置
RegExp:拥有一些静态属性,在使用正则时会自动改变这些属性的值,例如:input、lastMatch、lastParen、leftContext、multiline、rightContext,一级对应的$_、$&、$+、$`、$*、$',还有分组属性$1...$9.
exec: 得到的是匹配项、各个分组,与match的区别:在全局(g)情况下,match会匹配所有的情况,并且返回的为匹配项,不包含各个匹配组。
replace: 这是一个神奇的函数,把正则发挥的淋漓尽致。
var text = 'cat, bat, sat, fat';var result = text.replace('at', 'ond'); // "cond, bat, sat, fat" 只会匹配第一个 //如果希望匹配所有的,就需要使用正则表达式var text = 'cat, bat, sat, fat';var result = text.replace(/at/g, 'ond'); //"cond, bond, sond, fond" //假如还需要引用其中的匹配组呢var text = 'cat, bat, sat, fat';var result = text.replace(/(.at)/g, 'word ($1)'); //"word (cat), word (bat), word (sat), word (fat)" //对匹配项的复杂处理var text = '<div>';text.replace(/[<>]/g, function(mat, index, input) { if(mat === '<') { return '<' } else if(mat === '>') { return '>' }}) //"<div>"
9.arguments处理
该对象是函数内的参数对象,是一个类数组对象,但是并不是数组,不具有数组里面的slice、splice等方法,但是有时候需要获取arguments里面的某些参数怎么办呢?比较笨的方法对其进行遍历,另外一种方法就是调用call方法,完成参数获取。
function foo(a,b,c) { var arg = Array.prototype.slice.call(arguments, 1,3);}
10.createDocumentFragment
用于创建文档片段,可以避免多次与DOM进行交互,进而提高页面的性能。