文章目录
数据类型
指的就是字面量的类型;在JS中一共有六种数据类型:
- String 字符串
- Number 数值
- Boolean 布尔值
- Null 空值
- Undefined 未定义
- object 对象
其中String Number Boolean Null Undefined属于基本数据类型而0bject属于引用数据类型
String 字符串
- 在JS中字符串需要使用引号引起来
- 使用双引号或单引号都可以
- 引号不能嵌套,双引号不能放双引号,单引号不能放单引号
Number 数字
在JS中所有的数值都是Number类型,包括整数和浮点数(小数)
JS中可以表示的数字的最大值
Number. MAX VALUE
1.7976931348623157e+308
Number .MIN_ _VALUE 大于0的最小值
5e-324
如果使用Number表示的数字超过了最大值,则会返回一个Infinity(字面量) 表示正无穷
-Infinity 表示负无穷
使用typeof检查Infinity也会返回Number
NaN是一个特殊的数字,表示Not A Number
使用typeof检查一个NaN也会返回number
unll和undefine
null这个值专门用来表示-一个为空的对象;使用typeof检查一个null值时,会返回object
Undefined类型的值只有一个,就undefind当声明一个变量,但是并不给变量赋值时,它的值就是undefine
使用typeof检查一个undefined时也会返回undefined
强制类型转换
指将一个数据类型强制转换为其他的数据类型类型转换主要指,将其他的数据类型,转换为String Number Boolean
将其他的数据类型转换为String
方式一:
调用被转换数据类型的toString( )方法
该方法不会影响到原变量,它会将转换的结果返回
但是注意: null和undefined这两个值没有toString
如果调用他们的方法,会报错
方式二:
调用String()函数,并将被转换的数据作为参数传递给函数
使用String( )函数做强制类型转换时,
对于Number和Boolean实际上就是调用的toString()方法
但是对于null和undefined,就不会调用toString()方法
它会将null直接转换为"null"
将undefined直接转换为"undefined"
将其他的数据类型转换为Number
转换方式一:
使用Number()函数
字符串–>数字
- 如果是纯数字的字符串,则直接将其转换为数字
- 如果字符串中有非数字的内容,则转换为NaN
- 如果字符串是一个空串或者是一个全是空格的字符
布尔–>数字
true转成1
false转成0
null -->数字0
undefined -->数字NaN
转换为布尔类型
调用Boolean( )函数来将a转换为布尔值
-
数字—>布尔
除了0和NaN,其余的都是true -
字符串—>布尔
- 除了空串,其余的都是true
- null和undefined都会转换为false
-
对象也会转换为true
算数运算符
运算符也叫操作符;通过运算符可以对一个或多个值进行运算,并获取运算结果。
比如: typeof就是运算符,可以来获得一个值的类型。返回字符串。
算数运算符:
当对非Number类型的值进行运算时,会将这些值转换为Number然后在运算(除了字符串相加运算),任何值和NaN做运算都得NaN。
+
可以对两个值进行加法运算,并将结果返回如果对两个字符串进行加法运算,则会做拼串会将两个字符串拼接为一个字符串,并返回任何的值和字符串做加法运算,都会先转换为字符串,然后再相加。-
相减运算*
相乘运算/
相除运算
任何值和字符串相加都会转换为字符串,并做拼串操作我们可以利用这一特点, 来将-一个任意的数据类型转换为String我们只需要为任意的数据类型+一个""即可将其转换为String
一元运算符,只需要一个操作数
+正号
- 正号不会对数字产生任何影响
-负号
- 负号可以对数字进行负号的取反
- 对于非Number类型的值:
它会将先转换为Number,然后在运算;可以对一个其他的数据类型使用+,来将其转换为number;它的原理和Number()函数一样
自增++
- 通过自增可以使变量在自身的基础上增加1
- 对于一个变量自增以后,原变量的值会立即自增1
- 自增分成两种:后++(a++)和前++(++a)
- 无论是a++还是++a,都会立即使原变量的值自增1
- 不同的是a++和++a的值不同a++的值等于原变量的值(自增前的值)
自减和自增类似
逻辑运算
对于非布尔值进行与或运算时
会先将其转换为布尔值,然后再运算,并且返回原值
与运算:
- 如果第一个值为true,则必然返回第二个值
- 如果第一个值为false,则直接返回第一个值
或运算
- 如果第一个值为true,则直接返回第 一个值
- 如果第一个值为false,则返回第二个值
非数字的大小关系比较
非数值的情况
对于非数值进行比较时,会将其转换为数字然后在比较
如果符号两侧的值都是字符串时,不会将其转换为数字进行比较而会分别比较字符串中字符的Unicode编码
如果比较的两个字符串型的数字,可能会得到不可预期的结果
注意:在比较两个字符串型的数字时,一 定要转型
undefined衍生自null
所以这两个值做相等判断时,会返回true
NaN不和任何值相等,包括他本身
可以通过isNaN( )函数来判断一个值是否是NaN
===全等
- 用来判断两个值是否全等,它和相等类似,不同的是它不转换类型;如果两个值的类型不同,直接返回false。
- 与之相反的是不全等!==
JavaScript和Java的区别
- JS中的代码块,只具有分组的的作用,没有其他的用途
代码块内容的内容,在外部是完全可见的
输入:
prompt()可以弹出一个提示框,该提示框中会带有一个文本框,
用户可以在文本框中输入一段内容,该函数需要一个字符串作为参数,该字符串将会作为提示框的提示文字
用户输入的内容将会作为函数的返回值返回,可以定义一个变量来接收该内容
prompt( )函数的返回值是String类型的;可能需要转换。
switch 中的比较是全等比较。
向页面中输出:
使用document.write();想要换行可以在字符串中添加
对象的分类:
- 内建对象
由ES标准中定义的对象,在任何的ES的实现中都可以使用
比如: Math String Number Boolean Function object… - 宿主对象,
由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
比如BOM DOM - 自定义对象
由开发人员自 己创建的对象
对象:
JavaScript中只有一个类Objecti,每一个对象可以单独的添加属性和删除属性。
对象的属性名不强制要求遵守标识符的规范
如果要使用特殊的属性名,不能采用.的方式来操作
需要使用另一种方式:
语法:对象[“属性名”] = 属性值
使用[ ]这种形式去操作属性,更加的灵活,
在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性
in运算符
- 通过该运算符可以检查-个对象中是否含有指定的属性
如果有则返回true,没有则返回false - 语法:
“属性名” in对象
使用对象字面量,可以在创建对象时,直接指定对象中的属性
语法: {属性名:属性值,属性名:属性值…}
函数:
-
函数也是一个对象
函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码) -
函数中可以保存一些代码在需要的时候调用
-
使用typeof检查-个函数对象时, 会返回function
-
可以将要封装的代码以字符串的形式传递给构造函数(很少使用)
使用函数声明来创建一个函数
语法:
function函数名([形参1,形参2… .形参N]){
语句…
}
使用函数表达式来创建一个函数
使用函数的注意点:
-
调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
-
调用函数时,解析器也不会检查实参的数量;多余的实参不会被使用;如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
-
定义函数时,不需要定义返回值,函数返回什么就是什么。如果return语句,后不跟任何值就相当于返回一个undefined,如果函数中不写return,则也会返回undefined。
-
函数也是一个对象、
-
立即执行函数
函数定义完,立即被调用,这种函数叫做立即执行函数。
-
对象的属性值也可以是一个函数
枚举对象中的属性
使用for … in语句
语法:
for(var变量in对象){
}
for. . .in语句对象中有几个属性,循环体就会执行几次;每次执行时,会将对象中的一个属性的名字服值给变量
作用域
作用域指一个变量的作用的范围
在JS中一 共有两种作用域:
- 全局作用域
- 直接编写在script标签中的IS代码,都在全局作用域
- 全局作用域在页面打开时创建,在页面关闭时销毁
- 在全局作用域中有一一个全局对象window,
它代表的是一 一个浏览器的窗口, 它由浏览器创建我们可以直接使用
在全局作用域中:
- 创建的变量都会作为window对象的属性保存
- 创建的函数都会作为window对象的方法保存
- 函数作用域
- 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
- 每调用一次函数就会创建一个新的函数作用域, 他们之间是互相独立的
- 在函数中要访问有相同变量名的全局变量可以使用window对象
- 义形参就相当于在函数作用域中声明了变量
变量的声明提前
- 使用var关键字声明的变量,会在所有的代码执行之前被声明,
- 但是如果声明变量时不适用var关键字,则变量不会被声明提前
函数的声明提前
- 使用函数声明形式创建的函数function 函数(){}
它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数 - 使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
this:
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,
这个隐含的参数就是this,thi s指向的是一一个对象,
这个对象我们称为函数执行的.上下文对象
根据函数的调用方式的不同,this会指向不同的对象
- 以函数的形式调用时,thi s永远都是window
- 以方法的形式调用时,thi s就是调用方法的那个对象
- 当以构造函数的形式调用时,thi s就是新创建的那个对象
构造函数:
构造函数就是一一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写
构造函数和普通函数的区别就是调用方式的不同
普通函数是直接调用,而构造函数需要使用new关键字来调用
构造函数的执行流程:
- 立刻创建一个新的对象
- 将新建的对象设置为函数中this,在构造函数中可以使用thi s来引用新建的对象
- 逐行执行函数中的代码
- 将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。相比于Java,就是用定义构造函数代替定义类。
instanceof关键字:
使用instanceof可以检查-个对象是否是-一个类的实例
语法:
对象instanceof构造函数
如果是,则返回true,否则返回false
所以任何对象和Object左instanceof检查时都会返回true
想要所有对象共享一个函数,可以定义全局函数变量。
原型 prototype:
-
我们所创建的每一个函数, 解析器都会向函数中添加一个属性prototype
这个属性对应着一个对象,这个对象就是我们所谓的原型对象 -
如果函数作为普通函数调用prototype没有任何作用
当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,
指向该构造函数的原型对象,我们可以通过___ proto__ 来访问该属性
-
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,
我们可以将对象中共有的内容,统一设置到原型对象中
-
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,
-
使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
可以使用对象的hasOwnProperty( )来检查对象自身中是否含有该属性
如果没有则会去原型对象中寻找, 如果找到则直接使用
原型对象也是对象,所以它也有原型,
当我们使用一个对象的属性或方法时,会现在自身中寻找,
自身中如果有,则直接使用,
如果没有则去原型对象中寻找,如果原型对象中与,则使用,
如果没有则去,原型的原型中寻找,直到找到Object对象的原型,
Object对象的原型没有原型,如果在0bject中依然没有找到,则返回undefined
垃圾回收机制(GC)
- 在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作
- 我们需要做的只是要将不再使用的对象设置null即可
数组(Array)
数组也是一个对象
它和我们普通对象功能类似,也是用来存储一些值的
- 不同的是普通对象是使用字符串作为属性名的,
而数组时使用数字来作为索引操作元素
索引:
- 从0开始的整数就是索引
- 数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据
使用数组的注意事项:
-
对于连续的数组,使用length可以获取到数组的长度(元素的个数)
对于非连续的数组,使用length会获取到数组的最大的索引+1 -
修改length
如果修改的1ength大于原长度,则多出部分会空出来丫
如果修改的1ength小于原长度,则多出的元素会被删除 -
数组中可以放任意类型
数组的常用方法
-
push()
该方法可以向数组的末尾添加一一个或多个元素,并返回数组的新的长度;可以将 要添加的元素作为方法的参数传递,这样这些元素将会自动添加到数组的末尾。 -
pop( )
该方法可以删除数组的最后一个元素,并将被删除的元素作为返回值返回。 -
unshift( )
向数组开头添加一个或多个元素,并返回新的数组长度。 -
shift( )
可以删除数组的第一个元素 ,并将被删除的元素作为返回值返回。 -
forEach( )
IE8以上支持
方法需要-一个函数作为参数
像这种函数,由我们创建但是不由我们调用的,我们称为回调函数
数组中有几个元素函数就会执行几次,每次执行时,浏览器会将遍历到的元素
以实参的形式传递进来,我们可以来定义形参,来读取这些内容
浏览器会在回调函数中传递三个参数:
第一个参数,就是当前正在遍历的元素
第二个参数,就是当前正在遍历的元素的索引
第三个参数,就是正在遍历的数组
-
slice()
可以用来从数组提取指定元素
该方法不会改变元素数组,而是将截取到的元素封装到一个新数组中返回
参数:
1.截取开始的位置的索引,包含开始索引
2.截取结束的位置的索引,不包含结束索引
第二个参数可以省略不写,此时会截取从开始索引往后的所有元素
索引可以传递一个负值,如果传递一一个负值,则从后往前计算 -
splice()
可以用于删除数组中的指定元素
使用splice( )会影响到原数组,会将指定元素从原数组中删除
并将被删除的元素作为返回值返回
参数:
第一个,表示开始位置的索引
第二个,表示删除的数量
第三个及之后的参数:
可以传递一些新的元素,这些元素将会自动插入到开始位置索引前边 -
concat( )
可以连接两个或多个数组,并将新的数组返回
该方法不会对原数组产生影响 -
join()
该方法可以将数组转换为一个字符串
该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回
在join( )中可以指定-个字符串作为参数,这个字符串将会成为数组中元素的连接符
如果不指定连接符,则默认使用,作为连接符 -
reverse ( )
该方法用来反转数组(前边的去后边,后边的去前边)
该方法会直接修改原数组 -
sort()
即使对于纯数字的数组,使用sort( )排序时,也会按照Uni code编码来排序,
所以对数字进排序时,可能会得到错误的结果。
我们可以在sort( )添加一个回调函数,来指定排序规则,
回调函数中需要定义两个形参,
浏览器将会分别使用数组中的元素作为实参去调用回调函数
使用哪个元素调用不确定,但是肯定的是在数组中a一定在b前边
浏览器会根据回调函数的返回 值来决定元素的顺序,
如果返回一个大于0的值,则元素会交换位置
如果返回一个小于θ的值,则元素位置不变
如果返回一个日,则认为两个元素相等,也不交换位置
- call( )和app1y()
这两个方法都是函数对象的方法,需要通过函数对象来调用
当对函数调用call( )和apply( )都会调用函数执行
在调用call( )和apply( )可以将一一个对象指定为第一个参数
此时这个对象将会成为函数执行时的this
两个方法的区别:
call( )方法可以将实参在对象之后依次传递
apply()方法需要 将实参封装到一个数组中统一传递
封装实参的对象arguments:
在调用函数时,浏览器每次都会传递进两个隐含的参数:
- 函数的上下文对象this
- 封装实参的对象arguments
arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度
在调用函数时,我们所传递的实参都会在arguments中保存
arguments . length可以用来获取实参的长度
我们即使不定义形参,也可以通过arguments来使用实参,只不过比较麻烦
arguments[e]表示第 一个实参
arguments[1]表示第二个实参
它里边有一个属性叫做callee,
这个属性对应一个函数对象,就是当前正在指向的函数的对象
JavaScript中的基本类型是否是对象?
- 方法和属性能添加给对象,不能添加给基本数据类型
当我们对一些基本数据类型的值去调用属性和方法时,
浏览器会临时使用包装类将其转换为对象,然后在调用对象的属性和方法。 - 所以基本数据类型并不是对象,只是可以通过装箱的方法转换为对象,
JavaScript中使用正则表达式
创建正则表达式的对象
语法:
var变量= new RegExp( “正则表达式” , “匹配模式”) ;
第二个参数可以没有
使用typeof检查正则对象,会返回object
在构造函数中可以传递一个匹配模式作为第二 个参数,可以是
i 忽略大小写
g 全局匹配模式
m 执行多行匹配
使用字面量来创建正则表达式
语法:
var变量= /正则表达式/匹配模式
正则表达式的方法:
- test( )
使用这个方法可以用来检查一 个字符串是否符合正则表达式的规则,如果符合则返回true,否则返回false