JavaScript
- JS跟Java关系就像老婆和老婆饼的关系, 两者没有半毛钱关系, 只是为了蹭热度
- JS也叫ECMAScript
JS的使用方式
- script标签内直接书写
<script>js代码</script>
- 通过script标签src属性引入外部js文件
<script src="myscript.js"></script>
注释
//单行注释
/*
多行注释1
多行注释2
多行注释3
*/
变量
- 变量声明 (需要使用关键字)
- var 全局
- let 局部
- 变量名
- 数字 字母 下划线 $
- 不能使用关键字
- 推荐使用驼峰体
常量
- const关键字声明真正的常量
- python中没有真正的常量, 只是约定俗成的将变量名大写的变量称之为常量
数据类型
-
数值类型 number
-
字符类型 string
-
对象 object
- 数组 []
- 自定义对象 {}
-
布尔值 boolean
-
undefined 只声明变量, 没有赋值
-
typeof 用来查看数据类型
强制类型转换
parse
parseInt(x)
parseString(x)
数字 (Number)
- js不区分整型和浮点型, 就只有一种数字类型---Number
- NaN表示的是 Not a Number
parseInt("abc")
---> NaNtypeof NaN
---> number
字符类型 (String)
方法 | 效果 |
---|---|
.length | 返回长度 |
.trim() / .trimLeft() / .trimRight() | 移除空白 |
.charAt(n) | 返回索引为n的元素 |
.concat(value1, value2...) | 拼接 |
.subString(from, to) | 根据索引获取子序列, 不能识别负数 |
.slice(start, end) | 切片 |
.toLowerCase() | 小写 |
.toUpperCase() | 大写 |
.split() | 分割 |
- 模板字符串, 反引号``包裹的字符串
- 可以当做普通字符串
- 定义多行字符串
- 在字符串中嵌入变量
${}
//定义多行字符串
var info = `
my name is bigb
my age is 18
`
//嵌入变量
var name = "bigb", age = 18
`My name is ${name}, I am ${age} years old`
布尔值 (Boolean)
- 小写ture, false
- 0, null, 空, undefined, NaN都是false
对象之数组
方法 | 效果 |
---|---|
.length | 长度 |
.push(ele) | 尾部追加元素 |
.pop() | 获取尾部元素 |
.unshift(ele) | 头部插入元素 |
.slice(start, end) | 切片 |
.reverse() | 反转 |
.join(seq) | 将数组元素连接成字符串 |
concat(val, ...) | 连接数组 |
.sort() | 排序 |
.forEach() | 将数组的每个元素专递给回调函数 |
.splice() | 删除元素, 并向数组添加新元素 |
.map() | 映射, 返回一个新数组, 新数组的元素是 旧数组的元素传入函数得到的结果 ( 同python的map方法相同) |
运算符
- 算数运算符
+ - * / % ++ --
++
自增1--
自减1
var a = 1
var b = a++ //先赋值, 再自增, b=1, a=2
var c = ++a //先自增, 再赋值, a=3, b=3
- 比较运算符
> >= < <= != !== == ===
- == 弱等于, 会将两边自动转为相同的数据类型
- === 强等于
- 逻辑运算符
&&
and||
or!
not
- 赋值运算符
= += -= *= /=
- 和Python一样
流程控制
- if---else
// 判断语句放在小括号内, 执行语句放在大括号内
var age = 18
if (age >= 18){
console.log("已经是大人了")
}else {
console.log("还是个小屁孩")
}
- if---else if---else
weather = "sunny"
if (weather=="sunny") {
console.log("play outside")
}else if (weather=="riany") {
console.log("sleep")
}else {
console.log("play inside")
}
- switch
/*
会将小括号内的表达式结果和case后的值进行匹配, 执行相应的代码块
如果没有匹配到case, 就会执行default下面的代码块
*/
switch (new Date().getDay()) {
case 0:
day = "Sunday";
break
case 6:
day = "Saturday";
break
default:
day = "work day";
}
//"Saturday"
- for
for (var i=0;i<5;i++) {
console.log(i)
}
/*
0
1
2
3
4
*/
- while
var i = 0
while (i < 5) {
console.log(i)
i++
}
/*
0
1
2
3
4
*/
- 三元运算
//条件成立执行?后面的代码, 条件不成立执行:后面的代码
var a = 1
var b = 2
a > b ? console.log(a) : console.log(b)
函数
- 定义函数的关键字: function
// 语法
function 函数名(参数) {
执行代码
return 返回值
}
// 普通函数
function f1() {
console.log("function without arg and return")
}
//有参函数
function sum(a, b) {
console.log(a+b)
}
// 带有返回值(只能有一个返回值)
function rectArea(length, width) {
area = length * width
return area
}
// 匿名函数
var sum = function(a, b) {
return a + b
}
sum(1, 2)
// 立即执行函数
(function(a, b) {
return a + b;
})(1, 2)
// 箭头函数(js的语法是真的骚啊)
var sum = (num1, num2) => sum1 + sum2
// 等同于
function sum(num1, num2) {
return num1 + num2
}
// arguments包含所有传入函数的参数
function sum(num1, num2) {
console.log(arguments[0])
return num1 + num2
}
sum(1, 2)
/*
1
3
*/
- 函数的全局变量和局部变量
/*
局部变量
在函数内部声明的变量是局部变量, 只能在函数内部访问
只要函数运行完毕, 局部变量就会被删除
全局变量
在函数外部声明的变量是全局变量, 网页上的所有脚本和函数都能访问它
页面关闭, 全局变量会被删除
作用域
和python一样, 内层--->外层
*/
var city = "Beijing"
function f() {
city = "Shanghai"
function inner() {
city = "Shenzhen"
console.log(city)
}
inner()
}
f() // "Shenzhen"
内置对象和方法
- js中一起皆对象(Python: ???)
- 自定义对象
- Object 只能用字符串作为键, 键-值
- Map 可以使用其他类型的数据作为"键", 值-值
// 创建新对象
var person = new Object();
person.name = "bigb"
person.age = 18
console.log(person) // {name: "bigb", age: 18}
// 创建新映射
var m = new Map()
var info = {"name":"bigb", "age":18}
m.set(info, "bigb's info") // 添加键值
m.get(info) // "bigb's info"
m.delete(info)
- Date对象
// 创建新Date对象
// 不传参数
var d1 = new Date()
console.log(d1.toLocaleString())
// 传参数
var d2 = new Date("2018/6/19")
console.log(d2.toLocaleString())
// 将当前时间按照"2000-1-1 11:11 星期一"的格式输出
const WEEKMAP = {
0: "星期天",
1: "星期一",
2: "星期二",
3: "星期三",
4: "星期四",
5: "星期五",
6: "星期六"
}
function showTime() {
var d1 = new Date()
var year = d1.getFullYear()
var month = d1.getMonth()
var day = d1.getDate()
var hour = d1.getHours()
var minute = d1.getMinutes() < 10 ? "0" + d1.getMinutes() : d1.getMinutes()
var week = WEEKMAP[d1.getDay()]
var strTime = `
${year}-${month}-${day} ${hour}:${minute} ${week}
`
console.log(strTime)
}
showTime();
- JSON对象
var str1 = '{"name": "bigb", "age": 18}'
var obj1 = {"name": "bigb", "age": 18}
// JSON字符串转为对象
var obj = JSON.parse(str1)
// 对象转为JSON字符串
var str = JSON.stringify(obj1)
- RegEXp对象
// 定义正则表达式两种方式
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}")
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/
// 正则校验数据
reg1.test('bigb666')
reg2.test('bigb666')
/*第一个注意事项,正则表达式中不能有空格*/
// 全局匹配
var s1 = 'egondsb dsb dsb'
s1.match(/s/)
s1.match(/s/g)
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/g
reg2.test('egondsb')
reg2.test('egondsb')
reg2.lastIndex
/*第二个注意事项,全局匹配时有一个lastIndex属性*/
// 校验时不传参数
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/
reg2.test()
reg2.test(undefined)
var reg3 = /undefined/
reg3.test()
- Math对象
abs(x) 返回数的绝对值。
exp(x) 返回 e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
Math