JavaScript基础

本文仅记录自己的学习笔记,欢迎大家评论与指正!

js的输出方式

  1. alert 弹窗

  2. console.log 控制台输出

  3. prompt 提示用户输入

  4. document.write('')在页面写入

模板字符串

  • 语法:`` 内容拼接时,用${}包住变量

数据类型

基本数据类型: Number,String,Boolean,undefined,null,symbol

引用数据类型: object(数组,对象,函数)

null开发中的使用场景:将来有个变量里面存放的是一个对象,但对象还没创建好,可以先给个null。

    // undefined 表示没有赋值,未定义
      // null 空 表示赋值了,但是内容为空
      //   官方解释:把 null 作为尚未创建的对象
      console.log(undefined + undefined); //NaN
      console.log(undefined + 1); //NaN
      console.log(undefined + "undefined"); //undefinedundefined
      console.log(undefined + null); //NaN
      console.log(null + null); //0
      console.log(null + 1); //1
      console.log(null + "null"); //nullnull
      console.log(NaN + 1);

检测数据类型

typeof 运算符可以返回被检测的数据类型。它支持两种语法格式:

  1. 作为运算符:typeof x (常用的写法)

  2. 函数形式:typeof(x)

转换数据类型

隐式转换

规则:

  • +号两边只要有一个是字符串,都会把另外一个转成字符串。

  • 除了+以外的算术运算符 比如 - * / 等都会把数据转成数据类型。

显式转换

概念:写代码时告诉系统该转成什么类型

转换成数字型

  • Number(数据)

    • 转成数字类型

    • 如果字符串内容里有非数字,转换失败时结果为NaN(Not a Number)即不是一个数字

    • NaN也是number类型的数据,代表非数字

  • parselnt(数据)

    • 只保留整数

    • 若数据是字符串,从该数据第一个字符(该字符必须为数字)到第二个非数字字符为止,提取整数。

  • parseFloat(数据)

    • 可以保留小数

转换成字符型

  • String(数据)

  • 变量.toString(进制)

转换成布尔值

  • Boolean(数据)

  • 来了都是true或false

switch语句

    switch (数据) {
        case 值1:
            代码1
            break
        case 值2:
            代码2
            break
        <!-- 可以连写共同使用一个代码体 -->
        case 值3
        case 值4
            代码3
        default:
            代码n
            break  // 这个break可以不写
    }
  1. switch case 语句一般用于等值判断,不适合于区间判断

  2. switch case 一般需要配合break关键字使用 没有break会造成case穿透。

for 循环的基本使用

  • 语法

for (let i = 0; i <= 10; i++) {
    // 循环体
    console.log(i)
}

循环中断

  • break 中断 在循环里面遇到 break关键字 就中断整个循环

  • continue 继续 在循环里遇到 continue关键字 就中断本次循环

for循环和while循环

  • 在未知循环次数的时候 使用 while 循环

  • 在已知循环次数的时候 使用 for 循环

操作数组的方法

1. push() 将一个或多个元素添加到数组的末尾,并返回该数组的新长度。此方法修改原有数组

        var arr = ['a','b','c'];
        var ele = arr.push('d');
        // ele结果为: 4;
        // arr数组被修改: ['a','b','c','d'];

2. pop(),从数组中删除最后一个元素,并返回该元素的值。如果数组为空,则返回undefined。此方法修改原有数组。

        var arr = ['a','b','c','d'];
        var ele = arr.pop();
        // ele结果为: 'd';
        // arr数组被修改: ['a','b','c'];

3. shift(),从数组中删除第一个元素,并返回该元素的值。此方法修改原有数组。

        var arr = ['a','b','c','d'];
        var ele = arr.shift();
        // ele结果为: 1;
        // arr数组被修改: ['b''c','d'];

4. unshift(),将一个或多个元素添加到数组的开头,并返回该数组的新长度。此方法修改原有数组。

        var arr = ['a','b','c'];
        var ele = arr.unshift('d');
        // ele结果为: 4;
        // arr数组被修改: ['d','a','b','c'];

5. slice(begin?,end?),返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

begin 可选 提取起始处的索引(从0开始),从该索引开始提取原数组元素 如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取, 例:slice(-2) >表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。 如果省略 begin,则 slice 从索引 0 开始。 如果 begin 超出原数组的索引范围,则会返回空数组。

end 可选 提取终止处的索引(从 0 开始),在该索引处结束提取原数组元素。slice 会提取原数组中索引从 begin 到 end 的所有元素(包含 begin,但不包含 end)。 例:slice(1,4) 会提取原数组中从第二个元素开始一直到第四个元素的所有元素 (索引为 1, 2, 3的元素)。 如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice>(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一>个元素,也就是只有倒数第二个元素)。 如果 end 被省略,则 slice 会一直提取到原数组末尾。 如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。

        var arr = ['a','b','c','d'];
        var res = arr.slice(0,2); 
        // arr数组未被修改: ['a', 'b', 'c', 'd'];
        // res数组为: ['a', 'b'];

6. splice(start,deleteCount?,item1?) ,通过删除或替换现有元素或者原地添加新的元素来修改数组, 并以数组形式返回被修改的内容 (如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组)。此方法修改原数组。

start: 指定修改的开始位置(从0计数)在该位置修改数组。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于 array.length-n);如果负数的绝对值大于数组的长度,则表示开始位置为第0位。

deleteCount (可选): 整数,表示要移除的数组元素的个数。 如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。 如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是说,如果它大于或者等于 start之 后的所有元素的数量),那么 start 之后数组的所有元素都会被删除。 如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。

item1, item2, … (可选): 要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。

        var arr = ['a', 'b', 'c', 'd'];
        // 从索引 2 的位置开始删除 0 个元素,插入"e"
        var insertOnce = arr.splice(2,0,'e');
        insertOnce = []
        arr = ['a', 'b', 'e', 'c', 'd']
        // 从索引3的位置开始删除一个元素
        var delOnce = arr.splice(3,1);
        // delOnce数组为: ['c']
        // arr数组被修改: ['a', 'b', 'e', 'd']

7. concat(),于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

        var arr1 = ['a', 'b', 'c', 'd'];
        var arr2 = ['e','f']
        var arr3 = arr1.concat(arr2);
        // arr3数组为: ['a', 'b', 'c', 'd','e','f']

8. join(),将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符(默认使用’,'分隔,如果使用"",则所有元素之间都没有任何字符)。

        var arr = ['a','b','c','d'];
        var str = arr.join("-")
        // str结果为: "a-b-c-d"

9. sort(),对数组的元素进行排序。此方法修改原数组。

        var arr = [1,2,3,4,5];
        arr.reverse();
        // arr数组被修改: [5,4,3,2,1]

10. reverse(),将数组中元素的位置颠倒,并返回该数组。该方法修改原数组。

        var arr = [1,2,3,4,5];
        arr.reverse();
        // arr数组被修改: [5,4,3,2,1]

11. forEach(function(currentValue,index?,array?),thisValue?),对数组的每个元素执行一次给定的函数。

currentValue 必选 当前元素的值

index 可选 当前元素的索引值

array 可选 当前元素属于的数组对象

thisValue 可选 执行callback函数时值被用作 this。如果省略或传入null,undefined那么callback函数的this为全局对象

        function logArrayElements(element, index, array) {
          console.log('a[' + index + '] = ' + element);
        }
        
        // 注意索引 2 被跳过了,因为在数组的这个位置没有项
        [2, 5, , 9].forEach(logArrayElements);
        // logs:
        // a[0] = 2
        // a[1] = 5
        // a[3] = 9

12. map(function(currentValue,index?,array?),thisValue?),创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。

        // 使用 map 重新格式化数组中的对象
        var kvArray = [{key: 1, value: 10},
                       {key: 2, value: 20},
                       {key: 3, value: 30}];
        
        var reformattedArray = kvArray.map(function(obj) {
           var rObj = {};
           rObj[obj.key] = obj.value;
           return rObj;
        });
        
        // reformattedArray 数组为: [{1: 10}, {2: 20}, {3: 30}],
        
        // kvArray 数组未被修改:
        // [{key: 1, value: 10},
        //  {key: 2, value: 20},
        //  {key: 3, value: 30}]

13. filter(function(currentValue,index,arr), thisValue),创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

        // 筛选出字符串数组中长度大于6的字符串
        const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
        
        const result = words.filter(word => word.length > 6);
        
        console.log(result);
        // log: ["exuberant", "destruction", "present"]

14. every(function(currentValue,index,arr), thisValue),测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值(若收到一个空数组,此方法在一切情况下都会返回 true)。

        // 检查是否数组中的所有数字都小于40
        const isBelowThreshold = (currentValue) => currentValue < 40;
        
        const array1 = [1, 30, 39, 29, 10, 13];
        
        console.log(array1.every(isBelowThreshold));
        // log: true

15. some(function(currentValue,index,arr), thisValue),测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值(如果用一个空数组进行测试,在任何情况下它返回的都是false)。

        // 检测数组中是否至少有一个数字大于 18:
        var ages = [3, 10, 18, 20];
        
        function checkAdult(age) {
            return age >= 18;
        }
        
        function myFunction() {
            document.getElementById("demo").innerHTML = ages.some(checkAdult);
        }

16. find(function(currentValue,index,arr), thisValue),返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。

        // 获取数组中第一个大于10的值
        const array1 = [5, 12, 8, 130, 44];
        
        const found = array1.find(element => element > 10);
        
        console.log(found);
        // expected output: 12

17. flat(depth?),按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。此方法不会改变原数组。

depth 可选 指定要提取嵌套数组的结构深度,默认值为 1。

        const arr1 = [0, 1, 2, [3, 4]];
        
        console.log(arr1.flat());
        // log: [0, 1, 2, 3, 4]
        
        const arr2 = [0, 1, 2, [[[3, 4]]]];
        
        console.log(arr2.flat(2));
        // log: [0, 1, 2, [3, 4]]

函数

形参、实参

      // str 是形参 只是为了定义函数中使用的变量
      function sayHi(str) {
        document.write(`${str}`);
      }
      // 调用函数时 传递的参数叫做 实参
      sayHi("Hello World!");

如果有多个形参 其中有形参有默认值 将有默认值的形参放到 最后面

函数返回值

  1. 在函数体中 尽量少使用 输出语句 如果需要将计算结果 给到调用者 给函数添加一个返回值 return

  2. return 后面的代码不会被执行,会立即结束当前函数,所以 return 后面的数据不要换行写

  3. 函数没有 retur 时 ,函数默认返回值为 undefined

补充

  • console.dir 可以打印 函数内部的信息

    function fn(n, m) {
        return n + m;
     }
     console.dir(fn);

     

  • 两个相同的 函数 后面的函数会 覆盖前面的 函数

  • 当 实参 和 形参 个数不一致时

    • 形参 过多 会自动添加 undefined 补充

    • 实参 过多 多余的实参会被忽略,函数内部有一个 argument 里面装着所有的 实参

      Javascrip中每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身

作用域

  • 全局作用域 在 整个script 标签

  • 块级作用域 比如 if 语句 循环语句中 使用 let 与const 定义的变量在 {} 里面的就是块级

  • 局部作用域 在函数内部

作用域链

在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。

立即执行函数

立即执行函数 就是 声明一个匿名函数,并且马上调用这个匿名函数

作用:避免全局变量之间的污染

      //   方式一:函数后的小括号在外面
      (function () {
        const sum = 1; // 跟其他的sum没有关联
        console.log(sum);
      })();
​
      //   方式二: 都包住
      (function () {
        const sum = 0;
        console.log(sum);
      }());

两个立即执行函数之间需要用 ; 隔开

短路运算(逻辑中断)

&&(且运算符):表示二者都为true才为true;

短路原则:例如 : a && b; 当a为true时,程序无论如何都会走b,而不管b为true或者false ,直0 接返回b ,当a为fasle时,程序会走a,直接返回a。

|| (或运算符):

“||”运算遇到true就返回。例如:a || b ,如果 a 为false,直接返回b,而不管b为true或者false 。如果 a 为true,直接返回a,而不会继续往下执行。

      console.log(undefined == null); //false
      console.log(undefined === null); //false
      console.log(undefined == 0); // false
      console.log(null == 0); // false
      console.log(null < 1); // true
      // 短路运算(逻辑中断)
      console.log(undefined && null); //undefined
      console.log(true && "abc"); // abc
      console.log("abc" && true); // true
      // null 参与数值运算时其值会自动转换为 0。
      console.log(null === 0); // false
      console.log(Number(NaN)); // NaN
      console.log(Number(undefined)); // NaN
      console.log(Number(null)); // 0
      console.log(typeof NaN); // number

逻辑与和逻辑或中的短路运算 并不是得到 true 或者 false 而是为了取值

对象

  • 查询对象 对象.属性 对象['属性']

  • 更改对象属性 对象.属性 = 值

  • 增加对象属性 对象.新属性 = 值

  • 删除对象元素 delete 对象.属性

      const person = {
        name: `zhangsan`,
        "user-name": "skyblue",
        age: 18,
        song() {
          alert(`唱歌`);
        },
      };
      //   查询对象  对象.属性  对象['属性']
      console.log(person.name);
      //   对象['属性'] 当属性名包含非法字符时,需要定义字符串来代替对象的键名 就使用[]查询对象 []里面存入对应键名的字符串
      console.log(person["user-name"]);
      //   更改对象属性  对象.属性 = 值
      person.age = 20;
      //   增加对象属性  对象.新属性 = 值
      person.ple = 15837577955;
      //   删除对象元素
      delete person.song;
      console.log(person);

遍历对象 for...in

k 表示 对象的属性名(键值)

for (const key in obj) {
        console.log(key); // 打印对象的属性名
        console.log(obj[key]); // 打印对象的值
      }

for in 遍历数组的一些缺陷:

  1. 索引是字符串型的数字,因而不能直接进行几何运算

  2. 遍历顺序可能不是实际的内部顺序

  3. for in会遍历数组所有的可枚举属性,包括原型。例如的原型方法method和name属性

记住,for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。遍历对象不能使用for of

for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name

内置对象Math

Math 对象 内置对象之一 其他内置对象有 document console

  • Math.abs() 取绝对值

  • Math.PI 圆周率pai

  • Math.ceil() 向上取整 得到比当前数字要小的 其中的最大整数

console.log(Math.ceil(10.5)); // 11 向上取整 得到比当前数字要小的 其中的最大整数
console.log(Math.ceil(-10.5)); // -10

  • Math.floor() 向下取整 得到比当前数字要小的 其中的最大整数

console.log(Math.floor(10.5)); // 10 向下取整 得到比当前数字要小的 其中的最大整数
console.log(Math.floor(-10.5)); // -11

  • Math.max() 找最大值 如果有非数字 就转换为数字 无法转换就返回 NaN

console.log(Math.max(2, 3, 4, "1")); // 找最大值 如果有非数字 就转换为数字 无法转换就返回 NaN

  • Math.min() 找最小值 如果有非数字 就转换为数字 无法转换就返回 NaN

console.log(Math.min(2, 3, 4, "1")); // 找最小值 如果有非数字 就转换为数字 无法转换就返回 NaN

  • Math.random() 在0-1之间随机取出一个数 包含 0 不包含 1 [0,1)

function getRandom(min, max) {
        // return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
        return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
      }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值