在Javascript中什么是伪数组?如何将伪数组转化为标准数组?
无法直接调用数组方法 或期望length属性有什么特殊的行为,
但可以对真正数组遍历方法来遍历它们。
如:argument参数,调用getElementsByTagName,document.childNode返回NodeList对象都属于伪数组。
用Array.prototype.slice.call(fakeArray)转化
Object number function boolean underfind
类型转换
强制类型转换:parseInt,parseFloat,number
隐式类型转换:== , ===(前者自动转换类型)
split() join() 的区别
前者是切割成数组的形式,后者是将数组转换成字符串
一、数据类型
1、总述
区别
基本类型: 1. 不可以添加属性 2.复制后/变量作为参数传递给函数时,改变原始值/在函数中改变变量,不影响副本
引用类型(由多个值组成):1.可以添加属性2.复制后/变量作为参数传递给函数时,改变原始值/在函数中改变变量,影响副本 (指针指向堆中的同一个对象)
【深拷贝】?
检测方法:
- typeof xx:检测是什么类型,返回类型(所有引用类型均返回object)
- xx instanceof 一种指定引用类型:检测是什么引用类型,返回boolean(只能用在一个框架里的数组)
- constructor 属性-Array.isArray(value):ECMAScript新增,同instanceof(可用在多个框架)
- valueOf:Array-字符串,Date-1970.1.1毫秒数,其他不变
- toString()/toLocaleString()
2、各类型
基本类型(见第三章):
Undefined、Null、Boolean、Number、String
引用类型:Object,Array,RegExp
object:
创建实例:
1.构造函数,然后添加对象的属性
2.字面量表示法,在字面量中直接写属性(最后一项没有逗号)
访问属性:
两种方法,1.a["b"],用于:a属性名中有空格 等 b 属性名是变量 。2.a.b
array:
创建实例:
1.构造函数,可以在()中设定长度/传入项
2.字面量表示法,注意逗号
访问属性:
可以直接通过访问xx[x]修改&新增值(可以不管长度跳着新增),可以直接通过修改length删除值
方法
改变原数组,返回其他:
push():栈方法,返回新数组长度
pop():栈方法,返回移除项
shift():队列方法,返回移除项
unshift():队列方法,返回新数组长度
reverse():
sort(function(a,b){return ~}):如果没有function,各项转化成字符串
操作方法不改变原数组,返回新数组:
concat():
slice(start,end可选):参数是负数时,倒数。
splice(index,deleteCount删除,item1,.....,itemX添加-可选)
位置方法,返回其他
indexOf/latIndexOf():返回位置值/没有返回-1
迭代方法,不改变原数组,返回其他/新数组,回调函数-function(item,index,array){return ~}
every()/some():返回boolean
map()/forEach():map返回新数组,filter无返回值
filter():返回新数组
reduce(func(prev,cur,index,array){return ~}):归并方法,第一次运算返回值作为第一个参数传入到第二次运算
Date
创建实例&方法:
返回日期毫秒数(1970.1.1的毫秒数)
new Date("月/日/年")=new Date( Date.parse("月/日/年"))
new Date(Date.UTC(年,月,其他可选) )
表示调用函数时的毫秒数:Date.now():【可在函数前后加两次,用来算出调用函数所用时间】
格式化:toUTCString()
RegExp
创建实例:三种,如果不知道用什么,用构造函数
/ab+c/i;
new RegExp('ab+c', 'i');
new RegExp(/ab+c/, 'i');
属性:
实例属性:global 、multiline、 ignoreCare、 lastIndex 、source
构造函数属性:input lastMatch lastParen leftContext rightContext multiline
方法:
pattern.exec()【每次运行只找一个,如果开了全局,第二次会找下一个,不开全局,则一直返回第一个】
pattern.test()【是否符合模式】例:
if(pattern.test(text)){alert(RegExp.input);
. | 任意单个字符 | 换行符\n \r \u2028 或 \u2029无效,m无效(多行时用[^],换行符有效) | |
\d=[0-9] | \D=[^0-9] | 数字 | |
\w=[A-Za-z0-9_] | \W=[^A-Za-z0-9_] | 数字字符下划线 | |
\s | \S | 空白符 | 包括空格、\t \v制表符、\f换页符、\n换行符、\r回车符、和其他 Unicode 空格 |
[\b]退格符、\0 NUL 字符(不要跟小数点) \cX 匹配字符串中的一个控制字符、\xhh编码为 hh (两个十六进制数字)的字符、\uhhhh Unicode 值为 hhhh (四个十六进制数字)的字符。 | |||
[xyz](连续的话=[x-z] 可以不连续) | [^xyz] | 集合中的任意一个字符 |
^ | 匹配输入/字符串的开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处 |
$ | 匹配输入/字符串的结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。 |
\b | 匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。 |
\B | 匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。 |
(x) | 匹配 x 并且捕获匹配项。 这被称为捕获括号(capturing parentheses)。 |
\n | n 是一个正整数。一个反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串。 |
(?:x) | 匹配 x 不会捕获匹配项。这被称为非捕获括号(non-capturing parentheses)。匹配项不能够从结果数组的元素 [1], ..., [n] 或已被定义的 RegExp 对象的属性 $1, ..., $9 再次访问到。 |
x* | 匹配前面的模式 x 0 或多次。例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"。 |
x+ | 匹配前面的模式 x 1 或多次。等价于 {1,}。例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"。 |
x*? x+? | 像上面的 * 和 + 一样匹配前面的模式 x,然而匹配是最小可能匹配。例如,/".*?"/ 匹配 '"foo" "bar"' 中的 '"foo"',而 * 后面没有 ? 时匹配 '"foo" "bar"'。 |
x? | 匹配前面的模式 x 0 或 1 次。例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。如果在数量词 *、+、? 或 {}, 任意一个后面紧跟该符号(?),会使数量词变为非贪婪( non-greedy) ,即匹配次数最小化。反之,默认情况下,是贪婪的(greedy),即匹配次数最大化。在使用于向前断言(lookahead assertions)时,见该表格中 (?=)、(?!) 和 (?:) 的说明。 |
x(?=y) | 只有当 x 后面紧跟着 y 时,才匹配 x。 例如,/Jack(?=Sprat)/ 只有在 'Jack' 后面紧跟着 'Sprat' 时,才会匹配它。/Jack(?=Sprat|Frost)/ 只有在 'Jack' 后面紧跟着 'Sprat' 或 'Frost' 时,才会匹配它。然而,'Sprat' 或 'Frost' 都不是匹配结果的一部分。 |
x(?!y) | 只有当 x 后面不是紧跟着 y 时,才匹配 x。例如,/\d+(?!\.)/ 只有当一个数字后面没有紧跟着一个小数点时,才会匹配该数字。/\d+(?!\.)/.exec("3.141") 匹配 141 而不是 3.141。 |
x|y | 匹配 x 或 y例如,/green|red/ 匹配 "green apple" 中的 ‘green',"red apple." 中的 'red'。 |
x{n} | n 是一个正整数。前面的模式 x 连续出现 n 次时匹配。例如,/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"。 |
x{n,} | n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配。例如,/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"。 |
x{n,m} | n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配。例如,/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的两个 "a",匹配 "caaaaaaandy" 中的前面三个 "a"。注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的 "a",匹配项也是 "aaa"。 |
Function
定义方法:
1.函数声明: function xx(){;}提升
2.函数表达式定义 :var xx=function(){;}不提升,故可能产生错误
3.构造函数 :可接受任意数量参数 最后一个参数是函数体,所有参数加引号,(不推荐,导致解析两次)
函数和函数名:
函数是对象,函数名是指向函数的指针
可以有多个名字指向同一函数,改一个名字不影响另一个,但如果直接用声明函数的方式去改,就会影响所有指针
同一个名字赋给两个不同函数,后一个会覆盖前一个函数(没有重载)
函数可以作为arg值传递给别的函数,要想在传递的时候不运行他,就要传递不带括号的函数名,也就是指针(所有filter这类函数中的回调函数都没有括号!)
内部属性
callee:
指向拥有argument对象的函数(在函数内部调用就是函数本身,防止函数在外部改名想调自己的时候调不到)
this:
调用函数的对象 全局中是windows
caller:
调用函数的函数 全局中是null
属性
length:argument数量
prototype:(见第六章。。)
方法
apply(在其中运行函数的作用域,数组/arguments)/call(在其中运行函数的作用域,数组中的各项):
把a函数的作用域改成b(在b函数内运行a,把b的参数用到a函数中),作用是扩充运行作用域
例:funtion a(arg1,arg2){~};function b(arg1,arg2){return a.apply(this,[arg1,arg2]/arguments)}
bind()。。
特殊引用类型-基本包装类型
每个基本类型都有一个基本包装类型,
因为基本类型不能用方法,所以当对基本类型使用方法时,他们会默默出现,创建
引用类型的一个实例,执行方法后销毁。所
不建议显式的调用因为new出的东西其实是个object 跟正常的基本类型是不同的,比如new一个boolean,它其实是一个object,值永远是TRUE