JavaScript笔记

77 阅读1分钟

简介

一种脚本语言,可用于HTML和Web,更可广泛用于服务器等领域。

组成:

ECMAScript 核心语法

Web APIs DOM(文档对象模型)+BOM

书写位置

  • 内部JS:<script>写在<body>最后
    <body>
    <!-- body content here -->
    
    <script>
        alert("Hello, JS!")
    </script>
    </body>
    
  • 外部JS:单独引入.js文件
    <body>
    <!-- body content here -->
    
    <script src="./main.js"></script>
    </body>
    
  • 内联JS:标签内部
    <button onclick="alert('Hello World!')">按钮</button>
    

输入/输出

document.write("写入文档");
console.log("打印日志");
alert("弹出提示框");

let a = prompt("输入框", "默认值");
document.write("<p>你输入的内容是:" + a + "</p>");

let age = 20; 
document.write(`<p>我的年龄是${age}岁</p>`);   //模板字符串

let,var区别

  1. 作用域:
  • var:var 声明的变量是函数作用域的,即在声明它的函数内部有效。
  • let:let 声明的变量是块级作用域的,即在声明它的块(如 if 语句块、for 循环块等)内有效。
  1. 变量提升:
  • var:var 声明的变量会发生变量提升,即在变量声明之前就可以访问到变量(但值为 undefined)。
  • let:let 声明的变量不会发生变量提升,在声明之前访问会报错。

var可重复声明

常量 const

必须赋值,不能修改

数组

let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}
  • 添加
    1. push(el1, el2):添加元素到尾部,返回新的长度
    2. unshift(el):添加到头部
  • 删除
    1. pop():删除最后一个元素,返回该元素
    2. shift():删除第一个元素
    3. splice(start, count=1, ..., (el1)...):指定开始位置,移除个数,替换元素
let arr = [1, 2 ,'Alex', 'Bob', 'Charlie']
console.log(arr.push('Dave', 'Eve'))    // 7
arr.unshift(0)

// [0, 1, 2, 'Alex', 'Bob', 'Charlie', 'Dave', 'Eve']
console.log(arr.shift())   // remove the first element
arr.splice(2, 1, 'Jane')    // replace 'Alex' with 'Jane'

console.log(arr)    // [0, 1, 'Jane', 'Bob', 'Charlie', 'Dave', 'Eve']
  • map(func):映射,返回新数组
  • join:连结成字符串

数据类型

弱数据类型:在程序运行时才确定

  • 基本数据类型: 存储的值本身
    1. Number
    2. String .trim() 去掉前后空格
    3. Boolean
    4. null
    5. undefined
    6. Symbol
  • 引用数据类型: 可变
    1. Object
    2. Array
    3. Function
    4. Date
    5. RegExp 正则表达式
let person = { // Object
    name: "John",
    age: 30
};

let colors = ["red", "green", "blue"]; // Array

function sayHello() { // Function
    console.log("Hello!");
}

let today = new Date(); // Date
let regex = /hello/i; // RegExp

类型判断

typeof 运算符/函数

console.log(typeof true);  // boolean

console.log(typeof undefined);  // undefined

console.log(typeof null);   // object

关于null与undefined

null是已赋值空类型

console.log(null+1) // 1
console.log(undefined+1) // NaN
console.log(null+null) // 0

类型转换

  1. 隐式转换: 运算,拼接
  2. 显示转换:手动
let str = "123"
let ans1 = Number(str) + 1 // 124
let ans2 = +str + 1 // 124 隐式

let age = +prompt("请输入你的年龄:"); // number
  • parseInt():只保留整数
  • parseFloat():保留小数
console.log(parseInt("89.65px"))    // 89
console.log(parseFloat("12.98px"))  // 12.98

比较运算符

  • == 值相等
  • === 值、类型都相等
  • !== 不全等
console.log(2 === 2) // true
console.log(2 == "2") // true
console.log(2 === "2") // false
console.log(null == undefined) // true
console.log(null === undefined) // false
console.log(null == 0) // false
console.log(null === 0) // false
console.log(undefined == 0) // false
console.log(undefined === 0) // false
console.log(NaN == NaN) // false
console.log(NaN === NaN) // false
console.log(0 == false) // true
console.log(0 === false) // false
console.log("" == false) // true
console.log("" === false) // false
console.log(1 == true) // true
console.log(1 === true) // false
console.log(1 == "true") // true
console.log(1 === "true") // false
console.log(0 == "") // true
console.log(0 === "") // false

建议用 === 判断

NaN不等于任何值

三元运算符

let num1 = 10, num2 = 20;
num1>num2 ? console.log("${num1}大于${num2}") : console.log("${num1}不大于${num2}");     // 10不大于20

let a = prompt("Enter a:");
document.write( a<10 ?  0+a : a)    //if a is less than 10, add 0 before it

函数

声明:function f(param = default) { return val }

function addTwo(a, b) {
  return a + b;
}

document.write(addTwo(2, 3)); // Output: 5

回调函数:作为参数被传递的函数

function call() {
    console.log('call')
}
setInterval(call, 1000)

setTimeout(() => {
    alert('Hello');
}, 2000);   // 仅一次性执行

匿名函数

let fn = function(param) { body }

立即执行

(function(){ })()(function(){ }())

(function(x, y) { console.log(x + y) }(2, 7)); // Output: 9

对象

无序的数据集合

  • 属性:属性名+值 成对出现 用,分隔
  • 方法:函数
let stu = {
  u_name: "John",
  age: 25,
  greet: function() {
    console.log("Hello, my name is " + this.u_name + " and I am " + this.age + " years old.");
  }
};

stu.greet(); // Output: Hello, my name is John and I am 25 years old.

stu.address = "123 Main St";
delete stu.age;

console.log(stu); // Output: {name: "John", address: "123 Main St"}
  1. 增加新属性/修改属性:obj.attr = val
  2. 删除:delete obj.attr

查询可用 obj['attr'] 属性名为字符串

let obj = {
    'o-name': 'Object 1',
}

console.log(obj['o-name']); // Output: Object 1

遍历

for (let key in obj) 语法

for (let key in stu) {  // Iterate over the object's properties
  console.log(key + ": " + stu[key]);
}
// Output:
// name: John
// age: 25
// address: 123 Main St 

日期对象

获取 let date = new Date()

let date = new Date('2021-01-01 12:00:00 AM UTC +00:00');
console.log(date.toLocaleDateString()); // "1/1/2021"

时间戳:毫秒,since 1970-01-01