代码风格

代码调试

面向对象

创建对象

 1    // 一系列的学生对象
 2    // 重复代码的复用: for/函数
 3    var stu1 = {
 4      name: "why",
 5      age: 18,
 6      height: 1.88,
 7      running: function() {
 8        console.log("running~")
 9      }
10    }
11    var stu2 = {
12      name: "kobe",
13      age: 30,
14      height: 1.98,
15      running: function() {
16        console.log("running~")
17      }
18    }
19    var stu3 = {
20      name: "james",
21      age: 25,
22      height: 2.05,
23      running: function() {
24        console.log("running~")
25      }
26    }
 1
 2    // 工厂函数(工厂生产student对象) -> 一种设计模式
 3    // 通过工厂设计模式, 自己来定义了一个这样的函数
 4    function createStudent(name, age, height) {
 5      var stu = {}
 6      stu.name = name
 7      stu.age = age
 8      stu.height = height
 9      stu.running = function() {
10        console.log("running~")
11      }
12      return stu
13    }
14
15    var stu1 = createStudent("why", 18, 1.88)
16    var stu2 = createStudent("kobe", 30, 1.98)
17    var stu3 = createStudent("james", 25, 2.05)
18    console.log(stu1)
19    console.log(stu2)
20    console.log(stu3)
 1    // JavaScript已经默认提供给了我们可以更加符合JavaScript思维方式(面向对象的思维方式)的一种创建对象的规则
 2    // 在函数中的this一般指向某一个对象
 3    /*
 4      如果一个函数被new操作符调用
 5        1.创建出来一个新的空对象
 6        2.让this指向这个空对象
 7        3.执行函数体的代码块
 8        4.如果没有明确的返回一个非空对象, 那么this指向的对象会自动返回
 9    */
10    function coder(name, age, height) {
11      this.name = name
12      this.age = age
13      this.height = height
14      this.running = function() {
15        console.log("running~")
16      }
17    }
18
19    // 在函数调用的前面加 new 关键字(操作符)
20    var stu1 = new coder("why", 18, 1.88)
21    var stu2 = new coder("kobe", 30, 1.98)
22    console.log(stu1, stu2)

内存分配

原始类型占据的空间是在栈内存中分配的;

对象类型占据的空间是在堆内存中分配的;

原始类型的保存方式:在变量中保存的是值本身

所以原始类型也被称之为值类型;

对象类型的保存方式:在变量中保存的是对象的“引用”

所以对象类型也被称之为引用类型;

this

以默认的方式调用一个函数,this指向window;

通过对象调用,this指向调用的对象;

构造函数

JavaScript中的构造函数是怎么样的?

构造函数也是一个普通的函数,从表现形式来说,和千千万万个普通的函数没有任何区别;

那么如果这么一个普通的函数被使用new操作符来调用了,那么这个函数就称之为是一个构造函数;

 1
 2    // 创建一系列的对象
 3    // 构造函数的名称: 使用大驼峰
 4    function Person() {
 5
 6    }
 7    var p1 = new Person()
 8    console.log(p1)
 9
10    // 平时创建普通的对象
11    // new Object()
12    var obj1 = {}
13    var obj2 = new Object()
14    var obj3 = new Person()

函数也是对象

function 继承 Object

1    function sayHello() {
2    }
3    sayHello.age = 18
4    console.log(sayHello.age)

内置类型

原始类型、包装类型

JavaScript的原始类型并非对象类型,所以从理论上来说,它们是没有办法获取属性或者调用方法的。

1var message = "hello world"
2var words = message.split("")
3var len = messages.length 
4
5
6// 其实是 js引擎会干这些事情 
7var message = new String("hello world")

原始类型是简单的值,默认并不能调用属性和方法;

这是因为JavaScript为了可以使其可以获取属性和调用方法,对其封装了对应的包装类型;

常见的包装类型有:String、Number、Boolean、Symbol、BigInt类型

Number类型

number 它有一个对应的数字包装类型Number

 1    // Number构造函数 -> window.Number
 2    // var num = 123 // new Number(num)
 3
 4    // 类属性
 5    // Number中本身是有自己的属性
 6    console.log(Number.MAX_VALUE)
 7    console.log(Number.MIN_VALUE)
 8    // integer: 整数
 9    console.log(Number.MAX_SAFE_INTEGER)
10    console.log(Number.MIN_SAFE_INTEGER)
11
12    // 对象的方法
13    // toString(base)
14    var num = 1000
15    console.log(num.toString(), typeof num.toString())
16    console.log(num.toString(2))
17    console.log(num.toString(8))
18    console.log(num.toString(16))
19
20    // console.log(123..toString(2))
21
22    // toFixed的使用(重要)
23    var pi = 3.1415926
24    console.log(pi.toFixed(3))
25
26    // 类的方法
27    // parseInt
28    // parseFloat
29    // 整数: 123
30    // 浮点数: 小数 123.321
31    var num1 = "123.521"
32    console.log(Number(num1).toFixed(0))
33    console.log(Number.parseInt(num1))
34    console.log(Number.parseFloat(num1))
35
36    // window对象上面
37    console.log(parseInt(num1))
38    console.log(parseFloat(num1))
39
40    // function HYNumber() {
41    // }
42    // HYNumber.parseInt2 = function() {
43    // }
44    // window.parseInt2 = HYNumber.parseInt2
45    // console.log(window.parseInt2 === HYNumber.parseInt2)
46
47    console.log(parseInt === Number.parseInt)

Math对象

Math是一个内置对象(不是一个构造函数),它拥有一些数学常数属性和数学函数方法;

Math常见的方法:

  • Math.floor:向下舍入取整
  • Math.ceil:向上舍入取整
  • Math.round:四舍五入取整
  • Math.random:生成0~1的随机数(包含0,不包含1)  Math.pow(x, y):返回x的y次幂

Math中还有很多其他数学相关的方法,可以查看MDN文档:

 1    // console.log(typeof Number) // function
 2    // var num = new Number()
 3
 4    // Math -> 对象
 5    // window/obj/console
 6    // console.log(typeof Math)
 7    // var math = new Math()
 8
 9    // Math对象的属性
10    // console.log(Math.PI)
11
12    // Math对象的方法
13    // var num = 3.55
14    // console.log(Math.floor(num)) // 3
15    // console.log(Math.ceil(num)) // 4
16    // console.log(Math.round(num)) // 4
17
18    // 另外方法
19    // random: 随机生成 [0, 1)
20    console.log(Math.random())
21    // 需求: [5~50)的随机数
22    // [a, b)
23    // y = a
24    // x = b - a
25    // Math.floor(Math.random() * x) + y
26    for (var i = 0; i < 1000; i++) {
27      var randomNum = Math.floor(Math.random() * 45) + 5
28      console.log(randomNum)
29    }
30
31    // Math.pow(x, y)
32    console.log(Math.pow(2, 4))

String类

String也是包装类型

String常见的属性:

  • length:获取字符串的长度;

访问字符串的字符

  • 使用方法一:通过字符串的索引 str[0]
  • 使用方法二:通过str.charAt(pos)方法
  • 它们的区别是索引的方式没有找到会返回undefined,而charAt没有找到会返回空字符串;

字符串的遍历

  • 方式一:普通for循环
  • 方式二:for..of遍历
 1    var message = "Hello 你好World"
 2    // 1.属性: length
 3    console.log(message.length)
 4
 5    // 2.访问字符串中某个位置的字符
 6    console.log(message[4])
 7    console.log(message.charAt(4))
 8    console.log(message[20])
 9    console.log(message.charAt(20))
10
11    // 3.字符串的遍历
12    // for普通遍历
13    for (var i = 0; i < message.length; i++) {
14      console.log(message[i])
15    }
16
17    // for..of的遍历 -> 迭代器
18    // 目前可迭代对象: 字符串/数组
19    // 对象是不支持for..of
20    // String对象内部是将字符串变成了一个可迭代对象
21    for (var char of message) {
22      console.log(char)
23    }

修改字符串

字符串的不可变性

 1    var message = "Hello World"
 2    // 1.严格的修改字符串, 之前的字符串内部修改掉
 3    message[2] = "a"
 4    
 5    console.log(message)
 6    // String两个方法:(重要)
 7    // toUpperCase: 将所有的字符变成大写
 8    // toLowerCase: 将所有的字符变成小写
 9    var message1 = message.toUpperCase()
10    console.log(message)
11    console.log("message1:", message1)
12    message = message.toUpperCase()
13
14    var message2 = message.toLowerCase()
15    console.log(message2)

查找字符串

 1    var message = "my name is why."
 2    var name = "why"
 3
 4    // 判断一个字符串中是否有另外一个字符串
 5    // 1.indexOf(searchString, fromIndex)
 6    /*
 7      index:
 8        情况一: 搜索到, 搜索字符串所在索引位置
 9        情况二: 没有搜索到, 返回-1
10    */
11    //  var index = message.indexOf(name)
12    //  if (message.indexOf(name) !== -1) {
13    //    console.log("message中包含name")
14    //  } else {
15    //    console.log("message不包含name")
16    //  }
17
18    // 2.includes: ES6中新增一个方法, 就是用来判断包含关系
19    // if (message.includes(name)) {
20    //   console.log("message中包含name")
21    // }
22
23    // 3.startsWith: 是否以xxx开头
24    // if (message.startsWith("my")) {
25    //   console.log("message以my开头")
26    // }
27
28    // 4.endsWith: 是否以xxx结束
29    // if (message.endsWith("why")) {
30    //   console.log("message以why结尾")
31    // }
32
33    // 5.replace 替换字符串
34    // var newMessage = message.replace("why", "kobe")
35    // console.log(message)
36    // console.log(newMessage)
37    var newName = "kobe"
38    var newMessage = message.replace("why", function() {
39      return newName.toUpperCase()
40    })
41    console.log(newMessage)

截取字符串

1    var message = "Hello World"
2
3    // 获取子字符串
4    // console.log(message.slice(3, 7))
5    // console.log(message.slice(3, -1))
6    // console.log(message.slice(3))
7
8    // substr
9    console.log(message.substr(3, 7))

字符串拼接

 1  var str1 = "Hello"
 2    var str2 = "World"
 3    var str3 = "kobe"
 4
 5    // 1.字符串拼接
 6    // +
 7    // var newString = str1 + str2 + str3
 8    // console.log(newString)
 9    // concat方法: 链式调用
10    var newString2 = str1.concat(str2).concat(str3)
11    var newString3 = str1.concat(str2, str3, "abc", "cba")
12    console.log(newString2)
13    console.log(newString3)
14
15    // 2.删除收尾的空格
16    console.log("    why      abc   ".trim())
17
18    // 3.字符串切割split
19    var message = "abc-cba-nba-mba"
20    var items = message.split("-")
21    var newMessage = items.join("*")
22    console.log(newMessage)

数组

 1
 2    // 1.创建数组的方式
 3    var names = ["why", "kobe", "james", "curry"]
 4
 5    var product1 = { name: "苹果", price: 10 }
 6    var products = [
 7      { name: "鼠标", price: 98 },
 8      { name: "键盘", price: 100 },
 9      { name: "西瓜", price: 20 },
10      product1
11    ]
12
13    // 2.创建方式二: 类Array
14    var arr1 = new Array()
15    var arr2 = new Array("abc", "cba", "nba") // ["abc", "cba", "nba"]
16    console.log(arr1, arr2)
17
18    // 传入了一个数字, 它默认会当成我们要创建一个对应长度的数组
19    var arr3 = new Array(5) // [empty*5]
20    console.log(arr3, arr3[0])
21    var arr4 = [5]
22
23    // 3.通过索引访问元素
24    console.log(names[0]) // 第一个元素
25    console.log(names[names.length-1]) // 最后一个元素
 1    // 对于某一个结构的操作: 增删改查(数据库)
 2
 3    var names = ["abc", "cba", "nba"]
 4
 5    // 1.访问数组中的元素
 6    console.log(names[0])
 7    console.log(names.at(0))
 8    
 9    console.log(names[-1])
10    console.log(names.at(-1))
11
12    // 2.修改数组中的元素
13    // names[0] = "why"
14    // console.log(names)
15
16    // 3.新增数组中的元素(了解)
17    // names[3] = "kobe"
18    // 中间empty*6
19    // names[10] = "james"
20    // console.log(names)
21
22    // 4.删除数组中的元素(了解)
23    // delete names[1]
24    // console.log(names)
25    // console.log(names[1])
 1    // var names = ["abc", "cba", "nba", "mba", "abcd"]
 2
 3    // 1.在数组的尾部添加和删除元素
 4    // // push方法
 5    // names.push("why", "kobe")
 6    // console.log(names)
 7    // // pop方法
 8    // names.pop()
 9    // names.pop()
10    // console.log(names)
11
12    // // 2.在数组的头部添加和删除元素
13    // // unshift方法
14    // names.unshift("why", "kobe")
15    // console.log(names)
16    // // shift方法
17    // names.shift()
18    // console.log(names)
19
20    // 3. 在任意位置添加/删除/替换元素
21    var names = ["abc", "cba", "nba", "mba", "abcd"]
22    // 参数一: start, 从什么位置开始操作元素
23    // 参数二: deleteCount, 删除元素的个数
24
25    // 3.1.删除元素
26    // names.splice(1, 2)
27    // console.log(names)
28
29    // 3.2.新增元素
30    // deleteCount: 0, 后面可以添加新的元素
31    // names.splice(1, 0, "why", "kobe")
32    // console.log(names)
33
34    // 3.3.替换元素。.删除2个 加3个
35    names.splice(1, 2, "why", "kobe", "james")
36    console.log(names)
 1    var names = ["abc", "cba", "nba", "mba"]
 2
 3    // 1.属性length
 4    // 获取数组的长度length
 5    // console.log(names.length) // 4
 6
 7    // // length属性可写的(扩容)
 8    // names.length = 10
 9    // console.log(names)
10
11    // // 设置的length小于原来的元素个数
12    // names.length = 0
13    // console.log(names)
14
15    // 2.数组的遍历
16    // 2.1. 普通的for循环
17    for (var i = 0; i < names.length; i++) {
18      console.log(names[i])
19    }
20
21    // 2.2. for..in
22    for (var index in names) {
23      console.log(index, names[index])
24    }
25
26    // 2.3. for..of
27    for (var item of names) {
28      console.log(item)
29    }
 1    var names = ["abc", "cba", "nba", "mba", "why", "kobe"]
 2
 3    // 1.slice方法: 不会修改原数组
 4    // splice有区别: splice修改原有的数组
 5    // start 从什么位置开始
 6    // end 结束位置, 不包含end本身 ,截取
 7    var newNames = names.slice(2, 4)
 8    console.log(newNames)
 9
10    // 2.concat方法: 将多个数组拼接在一起
11    var names1 = ["abc", "cba"]
12    var names2 = ["nba", "mba"]
13    var names3 = ["why", "kobe"]
14    var newNames2 = names1.concat(names2, names3)
15    console.log(newNames2) // (6)['abc', 'cba', 'nba', 'mba', 'why', 'kobe']
16
17    // 3.join方法: 字符串split
18    console.log(names.join("-")) // abc-cba-nba-mba-why-kobe

数组查找

 1    /*
 2      indexOf方式.
 3      手动for循环
 4      数组的find方法
 5    */
 6
 7    // 1.数组中存放的是原始类型
 8    var names = ["abc", "cba", "nba", "mba"]
 9
10    // 1.1. indexOf
11    // 可以找到, 返回对应的索引
12    // 没有找到, 返回-1
13    console.log(names.indexOf("nbb"))
14
15
16    // 2.数组中存放的是对象类型
17    // var students = [
18    //   { id: 100, name: "why", age: 18 },
19    //   { id: 101, name: "kobe", age: 30 },
20    //   { id: 102, name: "james", age: 25 },
21    //   { id: 103, name: "why", age: 22 }
22    // ]
23
24    // 查找的是id为101的学生信息
25    // 2.1. 自己写一个for循环
26    // var stu = null
27    // for (var i = 0; i < students.length; i++) {
28    //   if (students[i].id === 101) {
29    //     stu = students[i]
30    //     break
31    //   }
32    // }
33
34    // // 判断上面的算法有没有找到对应的学生
35    // if (stu) {
36    //   console.log("找到了对应的101学生", stu)
37    // } else {
38    //   console.log("没有找到对应的101学生")
39    // }
40
41    // 2.2. find方法: 高阶函数
42    var students = [
43      { id: 100, name: "why", age: 18 },
44      { id: 101, name: "kobe", age: 30 },
45      { id: 102, name: "james", age: 25 },
46      { id: 103, name: "why", age: 22 }
47    ]
48
49    var stu = students.find(function(item) {
50      if (item.id === 101) return true
51    })
52    console.log(stu)

遍历

 1    var names = ["abc", "cba", "nba"]
 2
 3    // forEach函数: 可以帮助我遍历数组
 4    // for (var i = 0; i < names.length; i++) {
 5    //   console.log(names[i])
 6    // }
 7
 8    // 1.hyForEach版本一(大部分同学掌握)
 9    function hyForEach(fn) {
10      for (var i = 0; i < names.length; i++) {
11        fn(names[i], i, names)
12      }
13    }
14
15    hyForEach(function(item, index, names) {
16      console.log("-------", item, index, names)
17    })
18
19    // 2.hyForEach版本二
20    // function hyForEach(fn, arr) {
21    //   for (var i = 0; i < arr.length; i++) {
22    //     fn(arr[i], i, arr)
23    //   }
24    // }
25
26    // hyForEach(function(item, index, names) {
27    //   console.log("-------", item, index, names)
28    // }, names)
29
30    // hyForEach(function(item, index, names) {
31    //   console.log("-------", item, index, names)
32    // }, [123, 321, 111, 222])
33
34
35    // 3.hyForEach版本三
36    names.hyForEach = function(fn) {
37      for (var i = 0; i < this.length; i++) {
38        fn(this[i], i, this)
39      }
40    }
41
42    names.hyForEach(function(item, index, names) {
43      console.log("-------", item, index, names)
44    })
45
46    names.forEach(function(item, index, names) {
47      console.log("-------", item, index, names)
48    })
49
50
51    // 4.hyForEach版本四(了解)
52    // Array.prototype.hyForEach = function(fn, thisArgs) {
53    //   for (var i = 0; i < this.length; i++) {
54    //     fn(this[i], i, this)
55    //   }
56    // }
57    //
58    // names.hyForEach(function(item, index, names) {
59    //   console.log("------", item, index, names)
60    // })
61    //
62    // var students = [
63    //   { id: 100, name: "why", age: 18 },
64    //   { id: 101, name: "kobe", age: 30 },
65    //   { id: 102, name: "james", age: 25 },
66    //   { id: 103, name: "why", age: 22 }
67    // ]
68    //
69    // students.hyForEach(function(item, index, stus) {
70    //   console.log("++++++", item, index, stus)
71    // })

排序

 1
 2    // var nums = [20, 4, 10, 15, 100, 88]
 3
 4    // // sort: 排序
 5    // nums.sort(function(item1, item2) {
 6    //   // item1和item2进行比较
 7    //   // 返回是 整数
 8    //   // 谁小谁在前
 9    //   // return item1 - item2
10    //   return item2 - item1
11    // })
12
13    // console.log(nums)
14    // console.log(nums.reverse())
15
16
17    // 复杂类型的排序
18    var students = [
19      { id: 100, name: "why", age: 18 },
20      { id: 101, name: "kobe", age: 30 },
21      { id: 102, name: "james", age: 25 },
22      { id: 103, name: "curry", age: 22 }
23    ]
24
25    students.sort(function(item1, item2) {
26      return item1.age - item2.age
27    })
28    console.log(students)

高阶函数

 1
 2    // 1.forEach函数
 3    var names = ["abc", "cba", "nba", "mba"]
 4
 5    // 三种方式, 新增一种方式
 6    names.forEach(function(item) {
 7      console.log(item, this)
 8    }, { name: "why" })
 9
10    // 2.filter函数: 过滤
11    // var nums = [11, 20, 55, 100, 88, 32]
12    // 2.1. for循环实现
13    // var newNums = []
14    // for (var item of nums) {
15    //   if (item % 2 === 0) {
16    //     newNums.push(item)
17    //   }
18    // }
19    // 2.2. filter实现
20    // var newNums = nums.filter(function(item) {
21    //   return item % 2 === 0
22    // })
23    // console.log(newNums)
24
25
26    // 3.map函数: 映射
27    // var nums = [11, 20, 55, 100, 88, 32]
28    // var newNums = nums.map(function(item) {
29    //   return item * item
30    // })
31    // console.log(newNums)
32
33    // 4.reduce
34    // var nums = [11, 20, 55, 100, 88, 32]
35    // var result = 0
36    // for (var item of nums) {
37    //   result += item
38    // }
39    // console.log(result)
40    // 第一次执行: preValue->0 item->11
41    // 第二次执行: preValue->11 item->20
42    // 第三次执行: preValue->31 item->55
43    // 第四次执行: preValue->86 item->100
44    // 第五次执行: preValue->186 item->88
45    // 第六次执行: preValue->274 item->32
46    // 最后一次执行的时候 preValue + item, 它会作为reduce的返回值
47
48    // initialValue: 初始化值, 第一次执行的时候, 对应的preValue
49    // 如果initialValue没有传呢?
50    // var result = nums.reduce(function(preValue, item) {
51    //   console.log(`preValue:${preValue} item:${item}`)
52    //   return preValue + item
53    // }, 0)
54    // console.log(result)
55
56    // reduce练习
57    // var products = [
58    //   { name: "鼠标", price: 88, count: 3 },
59    //   { name: "键盘", price: 200, count: 2 },
60    //   { name: "耳机", price: 9.9, count: 10 },
61    // ]
62    // var totalPrice = products.reduce(function(preValue, item) {
63    //   return preValue + item.price * item.count
64    // }, 0)
65    // console.log(totalPrice)
66
67
68    // 综合练习: 
69    var nums = [11, 20, 55, 100, 88, 32]
70
71    // 过滤所有的偶数, 映射所有偶数的平方, 并且计算他们的和
72    // var total = nums.filter(function(item) {
73    //   return item % 2 === 0
74    // }).map(function(item) {
75    //   return item * item
76    // }).reduce(function(preValue, item) {
77    //   return preValue + item
78    // }, 0)
79    // console.log(total)
80
81    // var total = nums.filter(item => item % 2 === 0)
82    //                 .map(item => item * item)
83    //                 .reduce((preValue, item) => preValue + item, 0)
84    // console.log(total)

DOM

DOM相当于是JavaScript和HTML、CSS之间的桥梁

获取元素的方法

nodeType

dataset

1  <div id="abc" class="box" 
2       data-age="18" data-height="1.88"></div>
3
4  <script>
5    var boxEl = document.querySelector(".box")
6    // 小程序开发中使用
7    console.log(boxEl.dataset.age)
8    console.log(boxEl.dataset.height)
9  </script>

json

 1   var obj = {
 2      name: "why",
 3      age: 18,
 4      friend: {
 5        name: "kobe"
 6      }
 7    }
 8
 9    console.log(obj.name, obj.age)
10
11    // 1.将obj对象进行序列化
12    var objJSONString = JSON.stringify(obj)
13    console.log(objJSONString)
14
15    // 2.将对象存储到localStorage
16    localStorage.setItem("info", objJSONString)
17    
18    var item = localStorage.getItem("info")
19    console.log(item, typeof item)
20
21    // 3.将字符串转回到对象(反序列化)
22    var newObj = JSON.parse(item)
23    console.log(newObj)
24
25
26    // reviver  参数
27    var newObj2 = JSON.parse(item, function(key, value) {
28        if (key === "age") {
29            return value + 2
30        }
31        return value
32    })
33    console.log(newObj2) // age属性=20
 1    var obj = {
 2      name: "why",
 3      age: 18,
 4      friend: {
 5        name: "kobe"
 6      },
 7      // toJSON: function() {
 8      //   return "123"
 9      // }
10    }
11
12    // 1.replacer参数
13    var objJSONString = JSON.stringify(obj, function(key, value) {
14      if (key === "name") {
15        return "coderwhy"
16      }
17      return value
18    }, "")
19    console.log(objJSONString)
20
21    // 2.space参数
22    // var objJSONString = JSON.stringify(obj, null, 4)
23    // console.log(objJSONString)
24
25    // // 3.如果对象本身有显示toJSON方法, 那么直接调用toJSON方法
26    // var objJSONString = JSON.stringify(obj)
27    // console.log(objJSONString)

BOM:浏览器对象模型

  • window:包括全局属性、方法,控制浏览器窗口相关的属性、方法;
  • location:浏览器连接到的对象的位置(URL);
  • history:操作浏览器的历史;
  • navigator:用户代理(浏览器)的状态和标识(很少用到);
  • screen:屏幕窗口信息(很少用到

window对象

window对象在浏览器中可以从两个视角来看待

视角一:全局对象。

我们知道ECMAScript其实是有一个全局对象的,这个全局对象在Node中是global; 
在浏览器中就是window对象;

视角二:浏览器窗口对象。

作为浏览器窗口时,提供了对浏览器操作的相关的API;

事实上对于浏览器和Node中全局对象名称不一样的情况,目前已经指定了对应的标准,称之为globalThis,并且大多数现代浏览器都支持它;

  • 放在window对象上的所有属性都可以被访问;
  • 使用var定义的变量会被添加到window对象中;(仅针对浏览器,node 不是这样的)
  • window默认给我们提供了全局的函数和类:setTimeout、Math、Date、Object等;

大量的属性、方法、事件 查看文档 : https://developer.mozilla.org/zh-CN/docs/Web/API/Window

location对象

 1// 1.完整的URL
 2    console.log(location.href)
 3    // 2.获取URL信息
 4    console.log(location.hostname)
 5    console.log(location.host)
 6    console.log(location.protocol)
 7    console.log(location.port)
 8    console.log(location.pathname)
 9    console.log(location.search)
10    console.log(location.hash)
11
12
13    // 3.location方法
14    var btns = document.querySelectorAll("button")
15    btns[0].onclick = function() {
16      location.assign("http://www.baidu.com")
17    }
18    btns[1].onclick = function() {
19      location.replace("http://www.baidu.com")
20    }
21    btns[2].onclick = function() {
22      location.reload()
23    }
24
25
26    // 4.URLSearchParams
27    var urlSearchString = "?name=why&age=18&height=1.88"
28    var searchParams = new URLSearchParams(urlSearchString)
29    console.log(searchParams.get("name"))
30    console.log(searchParams.get("age"))
31    console.log(searchParams.get("height"))
32
33    searchParams.append("address", "广州市")
34    console.log(searchParams.get("address"))
35    console.log(searchParams.toString())

history 对象

有两个属性:

  • length:会话中的记录条数;
  • state:当前保留的状态值;

有五个方法:

  • back():返回上一页,等价于history.go(-1);
  • forward():前进下一页,等价于history.go(1);
  • go():加载历史中的某一页;
  • pushState():打开一个指定的地址;
  • replaceState():打开一个新的地址,并且使用replace;

history和hash目前是vue、react等框架实现路由的底层原理

screen

screen主要记录的是浏览器窗口外面的客户端显示器的信息:

 1    // 前端路由核心: 修改了URL, 但是页面不刷新
 2    // 1> 修改hash值
 3    // 2> 修改history
 4
 5    // 1.history对应的属性
 6    console.log(history.length)
 7    console.log(history.state)
 8
 9    // 2.修改history
10    var btnEl = document.querySelector("button")
11    btnEl.onclick = function() {
12      // history.pushState({ name: "why", age: 18 }, "", "/why")
13      history.replaceState({ name: "why", age: 18 }, "", "/why")
14    }
15
16    var backBtnEl = document.querySelector(".back")
17    backBtnEl.onclick = function() {
18      // history.back()
19      // history.forward()
20      // 类似于上面的两个方法, 只是可以传入层级
21      // history.go(-2)
22    }

1    console.log(navigator.userAgent)
2    console.log(navigator.vendor)
3    console.log(navigator.platform)
4    console.log(navigator.oscpu)