Js基本语法
Js的使用方式:
- 行内js
写在标签中的js代码
- 内部js
写在页面中的js代码
- 外部js
引入外部的js代码
注意:1.如果<script></script>标签设置了src属性,则在双标签中写的js代码无效
2、通常使用JS时,会选择内部JS或外部JS
语句:
JS代码是以行为单位,一行一行执行。
一般情况下,一行一条语句。
每句语句后面最好加上分号,如果一行写多条语句(不建议),则每条语句后面必须加分号。
如果是表达式,不需要加分号,如果加了JavaScript引擎会把它当做语句编译。
注释:
单行注释: // 注释内容
多行注释: /* 注释内容 */
Html风格:<!-- html的注释-- >
变量的声明
JavaScript 是一种弱类型语言,在声明变量时不需要指明数据类型,直接用 var 修饰符进行声明。
两种方式:
1、先声明,后赋值
2、声明并赋值
变量的注意点
1)若只声明而没有赋值,则该变量的值为 undefined。
2)变量要有定义才能使用,若变量未声明就使用,JavaScript 会报错,告诉你变量未定义
3)可以在同一条 var 命令中声明多个变量。
4)若使用 var 重新声明一个已经存在的变量,是无效的。
5)若使用 var 重新声明一个已经存在的变量且赋值,则会覆盖掉前面的值
6)JavaScript 是一种动态类型、弱类型语言,也就是说,变量的类型没有限制,可以赋予各种类型的值。
7)声明变量时,可以不加var修饰符,此时变量为全局变量(不建议)
变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。
JS是弱类型语言,变量没有类型,但数据有类型。
JavaScript 中有 6 种数据类型。
其中有五种简单的数据类型:
Undefined、Null、布尔、数值和字符串。
一种复杂数据类型 Object。
数 值(Number): 整数和小数(比如 1 和 3.14)
字符串(String): 字符组成的文本(比如"Hello World")
布尔值(Boolean):true(真)和 false(假)两个特定值
Undefined: 表示“未定义”或不存在,即此处目前没有任何值
Null: 表示空缺,即此处应该有一个值,但目前为空
对象(object)(引用) : 各种值组成的集合
1)、对象(object){name:"zhangsan",age:"18"}
2)、数组(array)[1,2,3]
3)、函数(function)function test() {}
1、typeof 操作符
typeof 操作符是用来检测数据类型。
说明:1、typeof null 返回的是 object 字符串
2、函数不是数据类型,但是也可以使用 typeof 操作符返回字符串。
typeof 操作符可以操作变量也可以操作字面量。
注意:函数在 JavaScript 中是对象,不是数据类型,所以使用 typeof 区分 function 和object 是有必要的
这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升。
注意:变量提升只对 var 命令声明的变量有效,如果一个变量不是用 var 命令声明的,就会发生变量提升。
undefined
undefined 类型的值是 undefined。
undefined 是一个表示"无"的原始值,表示值不存在。
常见的undefined的情况:
1、当一个变量只声明而未赋值时
2、当一个函数需要形参,调用时未传递形参,此时参数为undefined
3、当一个函数没有返回值,调用方式时去接收,会返回undefined
null
null 类型是只有一个值的数据类型,即特殊的值 null。它表示空值,即该处的值现在为空,
它表示一个空对象引用。
使用 Null 类型值时注意以下几点:
1)使用 typeof 操作符测试 null 返回 object 字符串。
2)undefined 派生自 null,所以等值比较返回值是 true。所以,未初始化的变量和赋值为null 的变量相等。
数值型
数值型包含两种数值:整型和浮点型。
1)所有数字(整型和浮点型)都是以 64 位浮点数形式储存。所以,JS 中 1 与 1.0 相等,而且 1 加上 1.0 得到的还是一个整数。浮点数最高精度是 17 位小数,由于浮点数运算时可能不精确,尽量不要使用浮点数做判断。
2)在存储数值型数据时自动将可以转换为整型的浮点数值转为整型。
3)对于过大或过小的数值,可以使用科学计数法来表示
4)Infinity、-Infinity
超过了表数范围,出现 Infinity(正无穷)或者-Infinity(负无穷)
isFinite()函数可以确定是否超出范围:
true:没有超出;false:超出了。
NaN
表示非数值(Not a Number),是一个特殊的值。
如:将字符串解析成数字出错的场合。
注意:
NaN 不等于任何值,包括它本身,因为它不是一个值
NaN 与任何数(包括它自己)的运算,得到的都是 NaN。
isNaN()可以用来判断一个值是否为 NaN
true:不是数字;false:是数字
字符串
使用 ' ' 或 " "引起来,如:'sxt',"good"。
使用加号’+’进行字符串的拼接,如:console.log('hello' + ' everybody');
对象
对象是一组数据和功能的集合。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
说明:
{}:表示使用对象字面量方式定义的对象。空的大括号表示定义包含默认属性和方法的对象。
instanceof 运算符
typeof 操作符对数组(array)和对象(object)的显示结果都是 object,那么可以利用
instanceof 运算符,它可用于判断一个变量是否某个对象的实例。
parseInt()和 parseFloat()两个全局转换函数。
前者把值转换成整数,后者把值转换成浮点数。
只有对 String 类型调用这些方法,这两个函数才能正确运行;
对其他类型返回的都是 NaN(Not a Number)。
parseInt()
会从下标0开始找,如果不是有效数字,返回NaN;如果是,则继续往后找,直到不是有效数字位置
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由 parseInt()方法的第二个参数指定的
如果十进制数包含前导 0,那么最好采用基数 10,这样才不会意外地得到八进制的值
parseFloat()方法
与 parseInt()方法的处理方式相似,从位置 0 开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字 符之前的字符串转换成数字。
不过,对于这个方法来说,第一个出现的小数点是有效字符。
如果有两个小数点,第二个小数点将被看作无效的,parseFloat()方法会把这个小数点之前的字符串转换成数字。
显式转换
toString()函数将内容转换为字符串形式
toFixed()函数将根据小数点后指定位数将数字转为字符串,四舍五入
注:不能对null和undefined使用
强制转换
JS 为 Number、Boolean、String 对象提供了构造方法,用于强制转换其他类型的数据。
此时操作的是整个数据,而不是部分
String()是最简单的,因为它可把任何值转换成字符串。
String()和toString()的区别,在于前者可以操作null和undefinded
数组的创建
var arr=[值 1,值 2,值 3]; //隐式创建
var arr=new Array(值 1,值 2,值 3); //直接实例化
var array=new Array(size); //创建数组并指定长度
基本操作
1、数组的长度可以通过 length 属性来获取,并可以任意更改
2、数组中的每一个元素都可以被访问和修改,甚至是不存在的元素,无所谓越界
数组的遍历
1、for(var i=0; i < 数组.length; i++) {}
2、for(var 下标名 in 数组) {}
3、数组.forEach(function(元素,下标){});
了解:
如果下标:
1.为非负整数(包括整数字符串):自动从 0 开始,不存在添加 undefined
2.为负数、小数、非数字符串:这些内容不计算在长度内,当成"属性"处理,相当于自定义属性。
数组非常灵活,使用数组元素
1.下标: 非负整数(包括整数字符串):
数组.下标
数组[下标]
2.下标:负数、小数、非数字字符串:
数组[属性]
* for -- > 不遍历属性
* foreach -- >不遍历属性和索引中的 undefined
* for in -- >不遍历索引中的 undefined
数组中提供的常用方法
push 添加元素到最后
unshift 添加元素到最前
pop 删除最后一项
shift 删除第一项
reverse 数组翻转
join 数组转成字符串
indexOf 数组元素索引
slice 截取(切片)数组,原数组不发生变化
splice 剪接数组,原数组变化,可以实现前后删除效果
concat 数组合并
1. 函数的定义
有三种函数定义的方式:函数声明语句、函数定义表达式、Function 构造函数
函数声明语句
function 函数名([参数列表]) {}
调用:函数名([参数列表]);
函数定义表达式
var 变量名/函数名 = function([参数列表]) {}
调用:变量名/函数名([参数列表]);
Function 构造函数
var 变量名 = new Function("参数1","参数2","最后一个参数为是函数体");
调用:变量名/函数名([参数列表]);
注意:
1、js 中的函数没有重载,同名的函数,会被后面的函数覆盖。
2、js 中允许有不定数目的参数
函数的参数
实参可以省略,那么对应形参为 undefined
若函数形参同名(一般不会这么干):在使用时以最后一个值为准。
可以给参数默认值:当参数为特殊值时,可以赋予默认值。
参数为值传递,传递副本 ;引用传递时传递地址,操作的是同一个对象。
函数的调用
常用调用方式:函数名([实参]);
存在返回值可以变量接收,若接收无返回值函数则为 undefined
1、函数调用模式
2、方法调用模式
3、间接调用模式
call()和 apply()方法可以用来间接地调用函数。
任何函数可以作为任何对象的方法来调用,哪怕这个函数不是那个对象的方法。
两个方法都可以指定调用的实参。
call()方法使用它自有的实参列表作为函数的实参,apply()方法则要求以数组的形式传入参数
匿名函数立即调用
(1)匿名函数:function ([参数]){}
(2)调用:(function ([形参]) {})([实参]);
在函数只被使用一次的情况下可以使用这种方式,简便省事
return 语句
作用:在没有返回值的方法中,用来结束方法。
有返回值的方法中,一个是用来结束方法,一个是将值带给调用者。