什么是javascript?
JS是一种脚本, 动态, 弱类型语言. 基于在网页上实现复杂功能而产生的语言.
虽然JS做为开发web页面的脚本语言而出名. 但是如今已被用到了很多非浏览器环境当中, 比如NodeJS, Apache, Electron, Frida.
JavaScript可以做什么?
Java和JavaScript有什么关系?
雷锋和雷峰塔的关系. 除了语法相似以外, 几乎没有任何关系.
JavaScript和JQuery有什么关系?
JQuery其实是JS的一个框架, 它封装了很多原生函数, 提供了更丰富的函数库. Vue和React等框架也是同样的道理, 只是它们在高度封装的过程中, 发展出了自己的抽象内涵.
浏览器页面内
浏览器为什么可以直接运行js
在浏览器内核中提供了JS引擎, 所以可以直接执行JS. 该JS引擎只是浏览器的一个线程, 用来执行js.
浏览器页面外
本质就是封装了浏览器内核当中的JS引擎, 达到了浏览器外运行JS的目的.
安装Node.js
https://nodejs.org/en/
安装IDE
https://www.jetbrains.com/webstorm/
配置IDE
File -> Settings -> Language&Frameworks -> Node.js and NPM
可变变量
声明一个可变变量
var a = 1;
let b = 2;
let和var的区别
var不会引起变量作用域的改变
a = 1
function foo(){
console.log(a)
}
// var a;
let a;
let只在代码块区域中有效
function foo(){
{
var a = 1;
let b = 2;
}
console.log(a);
console.log(b);
}
foo()
不可变变量/常量
const NAME = "tunan"
NAME = "chihai"
普通函数
关键字是function
函数体在代码块{}中声明
每一句语句结束以;结尾
let minNum = 20;
let maxNum = 90;
// 0~maxNum之间的整数
parseInt(Math.random()*maxNum)
// minNum ~ (maxNum+minNum)之间的整数
parseInt(Math.random()*maxNum) + minNum
// minNum ~ maxNum之间的整数
parseInt(Math.random()*(maxNum-minNum)) + minNum
function randInt(minNum, maxNum){
return parseInt(Math.random()*(maxNum-minNum)) + minNum
}
如果需要做到像python那样闭区间, 需要对(maxNum-minNum) + 1
匿名函数
(function(minNum, maxNum){
console.log(parseInt(Math.random()*(maxNum-minNum)) + minNum)
})
调用匿名函数
(function(minNum, maxNum){
console.log(parseInt(Math.random()*(maxNum-minNum)) + minNum)
})(20 ,90)
构造函数
略
变量和函数都是使用小驼峰命名法
let myVariable = 1
常量使用大写
CONST MAX_NUM = 1000
类和构造函数使用大驼峰命名法
function Dog(){
this.color = 'black'
}
私有属性用_表示
function Dog(){
this.color = 'black'
this._owner = 'tunan'
}
注释
单行注释
// .....
多行注释
/* ... */
6种原始类型
undefined
typeof False
"undefined" // 返回undefined的原因是js当中false是小写, False的话就变成了一个变量. 没有赋值声明的变量, 默认会指向undefined
boolean(布尔类型)
typeof false
typeof true
number
typeof 1
typeof 1.0
Bigint
typeof 1n
String(字符串)
typeof '1'
Symbol(符号)
了解即可
let a = Symbol(1)
let b = Symbol(1)
a === b
Object
一种类似字典, 用键对值表示属性关系的数据类型. 键是字符串或者Symbol, 值可以是任意值.
let obj = {undefined: 1, false:2, 1:3, 1n:4, '1':5}
// 正确赋值Symbol的方法
let a = Symbol(1)
obj[a] = 6
null
null和undefined有什么区别?
null表示一个空指针. undefined表示"无" 这样的一个值.
Function
对象
表面像字典, 但本质和python中的类相似, 里面的键对值相当于python类中的类属性
直接声明
let obj = {undefined: 1, false:2, 1:3, 1n:4, '1':5}
通过New一个对象
function Dog(){
this.color = 'black'
}
new Dog() // 返回了一个对象
数组
类似python中的list, 但是扩容机制有区别
声明一个数组
let myArray = [1, 2]
myArray[3] = 'a'
Uint8Array
表示8位无符号整型数组, 表示0~255.
new Uint8Array(length)
Uint16Array
Uint32Array
Map
可以认为是有序的字典
let myMap = new Map()
Set
let mySet = new Set()
mySet.add(1)
字符串
Create
声明一个字符串
let myString = "abcdefg"
// 可以包含换行符等空白字符
let myString = `abcdef
g`
合并两个字符串并返回一个新的字符串
let myString2 = '1234567'
let myString3 = myString + myString2
Retrieve
获取当前字符串的长度
myString.length
通过索引值获取单个字符
myString[index]
通过索引值获取一段范围内的字符串
myString.slice(start, end)
获取某个元素的索引值
myString.indexOf(value)
// 如果不存在该元素, 则返回-1
// 对-1进行位取反后得到的是0, 代表false
if (~myString.indexOf(value){
....
}
Update
替换目标字符串
// 只会替换掉它最先找到的元素
myString.replace(value_1, value_2)
// 替换掉所有匹配的子字符串
myString.replaceAll(value_1, value_2)
大小写转换
// 转为大写
myString.toUpperCase()
// 转为小写
myString.toLowerCase()
Delete
pass
字符串格式化
`get myString => ${myString}`
数组(Array)
Create
复制一个数组
let myArray = [1, 2, 3, 4]
let myArray2 = myArray
console.log(myArray === myArray2)
myArray2 = Array.from(myArray)
console.log(myArray === myArray2)
合并两个数组
> myArray + myArray2
// 返回的是字符串拼接的结果
< "1,2,3,41,2,3,4"
// js中合并数组的方法, 返回一个新的数组
let myArray3 = myArray.concat(myArray2)
Retrieve
查看当前数组的大小
myArray.length
通过索引值查询单个元素
myArray[index]
// 超过索引范围不会报错, 返回undefined
myArray[10086]
通过索引值获取一定范围内的元素
myArray.slice(1,3)
通过元素获取索引值’
myArray.indexOf(index)
Update
通过索引去替换元素
myArray[0] ='a'
// 超过索引范围, 会自动补全empty元素
myArray[1008] = 'b'
添加一个元素至末尾
myArray.push('c')
向指定下标插入元素
// splice默认用来删除, 如果数量参数为0, 则为添加
myArray.splice(起始索引, 数量, item)
myArray.splice(1, 0, 'd')
Delete
从末尾删除元素
myArray.pop()
通过索引值删除元素
myArray.splice(5, 10082)
排序
倒序
myArray.reverse()
排序
// 数组排序是将元素转为string后进行排序
myArray.sort()
[10086, 2, 3, 4, "a", "b", "d"]
function compare(a, b){
if(a < b){
return -1
}
if(a > b){
return 1
}
return 0
}
myArray = [1, 10087, 2, 9, 4]
myArray.sort(compare)
console.log(myArray)
对象(Object)
Create
合并两个对象, 并返回一个新对象
let myObj = {"a":1, "b":2}
let myObj2 = {"c":3, "d": 4}
Object.assign(myObj,myObj2)
Retrieve
获取当前对象所有key
Object.keys(myObj)
获取当前对象所有value
Object.values(myObj)
Update
键对值复制
Object.definePropery
Object.defineProperty(navigator, 'webdriver', {value: true, writable:true})
Delelte
delete myObj.a
JSON转换
let jsonData = JSON.stringify(myObj)
JSON.parse(jsonData)
获取当前时间
new Date()
时间格式化
new Date().toISOString()
获取时间戳
new Date().getTime() //精确到毫秒