2、变量和运算符

变量

声明格式:var name = value;

strict模式

JavaScript在设计之初,为了方便初学者学习,并不强制要求用var声明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var声明就被使用,那么该变量就自动被声明为全局变量:

i = 10; // i现在是全局变量

使用var申明的变量则不是全局变量,它的范围被限制在该变量被声明的函数体内

启用strict模式的方法是在JavaScript代码的第一行写上:

'use strict';

var、let、const

ES6引入let、const,之前,JavaScript 只有两种类型的作用域:全局作用域函数作用域

const

const声明的变量不可以进行修改,而且声明的时候必须赋值,和java的final相似

const声明的变量对象,可以修改对象的属性

let

let声明的作用域为块级作用域,即只作用于{},如果在函数外(全局作用域)和函数内(函数作用域)使用和var没有区别。区别在于,函数(块)外声明后,再在函数(块)内声明并赋值的区别

var a = 5

for(var a = 0;a <= 10;a++){}

console.log(a)

//11
let a = 5

//如果在循环中用 let 声明了变量 a,那么只有在循环内,变量 a 才是可见的。
for(let a = 0;a <= 10;a++){}

console.log(a)

//5

数据类型

可以使用函数typeof(obj),查看一个变量或值的数据类型

Number

JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型

var a = 10;
var b = 20.2;
var c = 12e2;
var d = -30;

console.log(a);
console.log(b);
console.log(c);
console.log(d);

// 10
// 20.2
// 1200
// -30

字符串

字符串是以单引号'或双引号"括起来的任意文本

var a = 'abc';
var b = "def";
var c = `
    你好呀,
    这是一个多行字符串
`

console.log(a);
console.log(b);
console.log(c);

// abc
// def

//     你好呀,
//     这是一个多行字符串

模板字符串

ES6新增模板字符串,可以使用变量作为替换

注意:使用${}作为模板,该字符串需要使用多行字符串的符号反引号

var name = 'lucy';
var age = 18;

var msg = `我叫${name},今年${age}岁了`

console.log(msg)

// 我叫lucy,今年18岁了

常用api

var str = 'abcdef'
//获取字符串长度
len = str.length
//获取指定索引的字符,字符串是不可变的!这个方法不可以用来赋值
b = str[1]
//将字符串全大写并返回
upStr = str.toUpperCase()
//将字符串全小写并返回
lowStr = str.toLowerCase()
//返回指定字符串所出现的索引,未找到返回-1
i = str.indexOf('bc')
//返回指定区间的字符串,左开右闭
s1 = str.substring(3)
s2 = str.substring(3,5)

布尔

var a = true;
var b = false;

console.log(a);
console.log(b);

// true
// false

数组

数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。

//建议使用这种声明方式
var arr1 = [1,2,'lucy',3]

var arr2 = new Array(1,2,'lucy',3)

console.log(arr1)
console.log(arr2)

// [ 1, 2, 'lucy', 3 ]
// [ 1, 2, 'lucy', 3 ]

常用api

var a = ['lucy','lily','tom']

//获取数组的长度,这个长度是可以进行赋值的
//如果赋值,多出来的会用undefined表示,如果长度变短,会截取
a.length
//获取指定索引的元素
a[1]
//修改指定索引元素
a[1] = 'james'
//获取元素所在索引
a.indexOf('tom')
//截取数组,返回截取后的数组,左开右闭
a.slice(1,2)
//向数组末尾添加一个两个元素,返回新的长度,参数可变
a.push('mo','monkey')
//删除最后一个元素,并返回
a.pop()
//向数组开始添加一个元素,返回新的长度,参数可变
a.unshift('timi')
//删除第一个元素,并返回
a.shift()
//对数组进行排序,可传入函数自定义规则
a.sort()
//反转数组
a.reverse()
//从数组的第2位开始删除3个元素,再添加两个元素到这个位置,并返回删除的元素
a.splice(2,3,'lulu','gogo')
//从数组的第2位开始删除3个元素
a.splice(2,3)
//连接两个数组,并返回新的数组
b = ['haha','yiyi']
a.concat(b)
//将数组的所有元素使用指定分隔符连接后,返回字符串lucy-lili-tom
a.join('-')
//返回数组符合要求的元素组成的新数组
a.filter(name => {
    return name.length > 3
})

对象

JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成

注意,最后一个键值对不需要在末尾加,,如果加了,有的浏览器(如低版本的IE)将报错。

对象的key只可以是字符串

var lucy = {
    name : 'lucy',
    age : 18,
    sex : '女'
};

console.log(lucy)
console.log(lucy.age)

// { name: 'lucy', age: 18, sex: '女' }
// 18

如果key含有特殊字符,那么必须使用引号包起来,说明是一个字符串,而且在获取对象属性值的时候,不可以使用obj.value的方式,所以命名属性的时候一定要规范

var lucy = {
    name : 'lucy',
    age : 18,
    'sex-name' : '女'
};

console.log(lucy)
console.log(lucy['sex-name'])

// { name: 'lucy', age: 18, 'sex-name': '女' }
// 女

判断属性是否存在

var lucy = {
    name : 'lucy',
    age : 18,
    'sex-name' : '女'
};

console.log('name' in lucy)
//js的所有对象最终原型链指向object,toString是object的
console.log('toString' in lucy)
//hasOwnProperty是判断对象本身有没有这个属性
console.log(lucy.hasOwnProperty('toString'))

// true
// true
// false

特殊值

NaN和Infinity

//表示Not a Number,即无法计算出结果
var a = NaN;
//表示无限大,超出Number能表示的最大值
var b = Infinity;

NaN和任何数值都不相等,和自己也不相等,要判断是否是NaN,需要使用函数isNaN()

null和undefined

null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。

JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用nullundefined仅仅在判断函数参数是否传递的情况下有用。

运算符

算术运算符

y = 5

运算符 描述 例子 x 运算结果 y 运算结果
+ 加法 x=y+2 7 5
- 减法 x=y-2 3 5
* 乘法 x=y*2 10 5
/ 除法 x=y/2 2.5 5
% 取模(余数) x=y%2 1 5
++ 自增,前后和java的逻辑一样 x=++y 6 6
-- 自减,前后和java的逻辑一样 x=--y 4 4

赋值运算符

x = 10,y = 5

运算符 例子 等同于 运算结果
= x=y x=5
+= x+=y x=x+y x=15
-= x-=y x=x-y x=5
*= x*=y x=x*y x=50
/= x/=y x=x/y x=2
%= x%=y x=x%y x=0

比较运算符

运算符 描述 比较 返回值
== 等于 x==8 false
=== 绝对等于(值和类型均相等) x==="5" false
!= 不等于 x!=8 true
!== 不绝对等于(值和类型有都不相等) x!=="5" true
> 大于 x>8 false
< 小于 x<8 true
>= 大于或等于 x>=8 false
<= 小于或等于 x<=8 true

逻辑运算符

x = 6,y = 3

运算符 描述 例子
&& and (x < 10 && y > 1) 为 true
|| or `(x==5
! not !(x==y) 为 true

流程控制语句

js的流程控制语句和java的一样