【JavaScript】js基础知识整理

(本文为js基础知识点整理,用于个人复习所用,如有错误请指正!)

  • 句子结尾可不带 ;,句子可以横跨多行

  • 变量命名

    • 首字符必须是字母、下划线 _ 或美元符号 $
    • 所有 JavaScript 标识符对大小写敏感,JavaScript 程序员倾向于使用以小写字母开头的驼峰大小写
    • 变量:var
    • JavaScript 中不能使用连字符。它是为减法预留的。first-name
  • 注释:同Java

  • 运算

    • JavaScript 从左向右计算表达式
    • 数字和字符串相加,结果将是字符串

    var x = "8" + 3 + 5; //835 var x = 3 + 5 + "8"; //88

    • === 等值等型 !== 不等值或不等型
    • << 有符号右移 <<< 无符号右移
    • **
  • 变量类型

    • undefined、boolean、string、number、object(数组属于对象)
    • typeof() 返回数据类型
    • 空值 既有值也有类型(与 undefined 不是一回事)
    • null 数据类型是对象,被看做不存在的事物。
    • Undefinednull 的值相等,但类型不相等
  • 对象

    • 访问属性:objectName.propertyName or objectName["propertyName"]

    • 字符串、数字可以是对象( var x = new String(".") ),== 相等,=== 不相等

    • 对象是易变的:它们通过引用来寻址,而非值。var x = person; x 和 person 是同一个对象。

    • delete 关键词会同时删除属性的值和属性本身

    • getter setter

      • get lang(){return this.language}
      • set lang(lang){this.language=lang}
      • 提供了更简洁的语法、允许属性和方法的语法相同、确保更好的数据质量、有利于后台工作
      • Object.defineProperty(obj,"reset",{get:function(){this.counter=0;}});
    • 构造器:类似于Java构造方法

    • 向构造器添加新属性(方法)

      • Object.prototype.newPropName="something";
      • Object.prototype.newFuncName=function(){return something};
    • ES5新方法

      // 添加或更改对象属性
      Object.defineProperty(object, property, descriptor)
      // 添加或更改多个对象属性
      Object.defineProperties(object, descriptors)
      // 访问属性
      Object.getOwnPropertyDescriptor(object, property)
      // 以数组返回所有属性
      Object.getOwnPropertyNames(object)
      // 以数组返回所有可枚举的属性
      Object.keys(object)
      // 访问原型
      Object.getPrototypeOf(object)
      // 阻止向对象添加属性
      Object.preventExtensions(object)
      // 如果可将属性添加到对象,则返回 true
      Object.isExtensible(object)
      // 防止更改对象属性(而不是值)
      Object.seal(object)
      // 如果对象被密封,则返回 true
      Object.isSealed(object)
      // 防止对对象进行任何更改
      Object.freeze(object)
      // 如果对象被冻结,则返回 true
      Object.isFrozen(object)
      
    • 属性元数据

      writable : true      // 属性值可修改
      enumerable : true    // 属性可枚举
      configurable : true  // 属性可重新配置
      writable : false     // 属性值不可修改
      enumerable : false   // 属性不可枚举
      configurable : false // 属性不可重新配置
      
  • 函数

    • 匿名函数(变量中存储表达式):var x = function (a, b) {return a * b};
    • 自调用函数:无法对函数声明进行自调用
    • typeof 运算符会为函数返回 "function",但是函数是对象,有属性和方法
    • arguments.length 返回函数被调用时收到参数数量
    • 箭头函数
      • const x = (x, y) => x * y;
      • 没有 this,不适合定义对象方法
      • 箭头函数未被提升,必须在使用前进行定义
      • 使用 const 比使用 var 更安全,因为函数表达式始终是常量值
    • 函数不会对参数值规定数据类型、不进行检查类型/数量
    • 省略的参数会被设置为 undefined ;参数过多,使用 arguments[i] 获得参数
  • 字符串

    • 长度
      • .length 返回字符串长度
    • 查找
      • indexOf() 返回字符串中指定文本首次出现的索引(位置),未找到返回 -1
      • lastIndexOf() 返回字符串中指定文本最后一次出现的索引(位置),未找到返回 -1
      • search() 方法无法设置第二个开始位置参数;indexOf() 方法无法设置更强大的搜索值(正则表达式)。
    • 裁剪
      • slice(start, end) 正负索引,省略参数则裁剩余部分
      • substring(start, end) 不能接受负的索引
      • substr(start, length) 正负索引,省略第二个参数则裁剩余部分
    • 其他函数
      • replace() 只替换首个匹配,大小写不敏感 /i;替换所有匹配 /g
      • toUpperCase() 转换大写
      • toLowerCase() 转换小写
      • concat() 连接
      • trim() 删除字符串两端的空白符
      • charAt()[ ] 如果找不到字符,[ ] 返回 undefined,而 charAt() 返回空字符串。
      • charCodeAt() 返回字符串中指定索引的字符 unicode 编码
      • split() 把字符串转换为数组
  • 数字

    • 可以带小数点也可以不带

    • 超大或超小的数可以通过科学记数法来写

    • JavaScript 数值始终是 64 位的浮点数

    • 整数(不使用指数或科学计数法)会被精确到 15 位;小数的最大数是 17 位,但是浮点的算数并不总是 100% 精准

    • 在所有数字运算(+除外)中,JavaScript 会尝试将字符串转换为数字

    • NaN 非数值;isNaN() 判断是否是数;Infinity

    • toString(N) 转换为N进制;toString() 转换为字符串

    • toExponential() 返回指数字符串值,参数指定小数位数

    • toFixed() 返回字符串,参数指定小数位数

    • toPrecision() 返回字符串,参数指定长度

    • valueOf() 返回数值,可以将 Number 对象转换为原始值(所有 JavaScript 数据类型都有 valueOf()toString() 方法)

    • 转换为数字

      • Number() 无法转换返回 NaN
      • parseInt() 允许空格,只返回首个数字,无法转换返回 NaN
      • parseFloat() 允许空格,只返回首个数字,无法转换返回 NaN
    • Number.

      属性 描述
      MAX_VALUE 返回 JavaScript 中可能的最大数。
      MIN_VALUE 返回 JavaScript 中可能的最小数。
      NEGATIVE_INFINITY 表示负的无穷大(溢出返回)。
      NaN 表示非数字值("Not-a-Number")。
      POSITIVE_INFINITY 表示无穷大(溢出返回)。
  • 数组

    • new Array() 不好!使用 []代替

    • 索引值

    • .length

    • indexOf() 搜索元素值并返回其位置;lastIndexOf()

    • find() 回通过测试函数的第一个数组元素的值;findIndex() 返回索引

    • 每个数组元素都运行的函数

      • forEach(func) 为每个数组元素调用一次函数
      • map() 每个数组元素执行函数,返回创建的新数组
      • filter() 创建一个包含通过测试的数组元素的新数组
    • reduce() 累加器,返回总和

      • reduceRight() 从数组的末尾向前将数组中的数组项做累加
    • every() 检查所有数组值是否通过测试,返回 boolean

    • some() 检查某些数组值是否通过测试,返回 boolean

    • JavaScript 不支持命名索引的数组;使用命名索引,JavaScript 会把数组重定义为标准对象

    • Array.isArray() 判断是不是数组,可以用 instanceof Array 判断,也等价于

      function isArray(x) {
          return x.constructor.toString().indexOf("Array") > -1;
      }
      
  • 变为字符串

    • toString() 逗号分隔

      • join() 自定义分隔符
    • pop() push()

    • shift() 删除第一个元素,返回被移出元素; unshift() 反向位移,开头添加元素,返回新长度

    • delete ??? 删除,变为 undefined,会留下未定义空洞,不好!

    • splice() 参数依次为 添加元素位置、删除元素个数、要添加的元素;可以用于移除元素。

    • concat() 连接,返回新数组

    • slice() 切片,返回新数组

    • sort() 排序,接受 function()

    • reverse() 反转

    • Math.max.apply(arr) 返回最大/最小值

  • 日期 Date()

  • 暂略,详见 https://www.w3school.com.cn/jsref/jsref_obj_date.asp

  • Math、if、switch、for

  • 正则表达式

    • 常用于两个字符串方法:search()replace()

    • 修饰符 描述
      i 执行对大小写不敏感的匹配。
      g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
      m 执行多行匹配。
      表达式 描述
      [abc] 查找方括号之间的任何字符。
      [0-9] 查找任何从 0 至 9 的数字。
      (x|y) 查找由 | 分隔的任何选项。
      元字符 描述
      \d 查找数字。
      \s 查找空白字符。
      \b 匹配单词边界。
      \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
      量词 描述
      n+ 匹配任何包含至少一个 n 的字符串。
      n* 匹配任何包含零个或多个 n 的字符串。
      n? 匹配任何包含零个或一个 n 的字符串。
    • test() 通过模式来搜索字符串,返回 boolean

    • exec() 通过模式来搜索字符串,返回文本 or null

  • try throw catch finally

    • 错误名 描述
      EvalError 已在 eval() 函数中发生的错误
      RangeError 已发生超出数字范围的错误
      ReferenceError 已发生非法引用
      SyntaxError 已发生语法错误
      TypeError 已发生类型错误
      URIError 在 encodeURI() 中已发生的错误
  • 重复声明某个 JavaScript 变量,将不会丢它的值

  • 在块中重新声明变量也将重新声明块外的变量

  • 如果为尚未声明的变量赋值,此变量会自动成为全局变量

  • let

    • let 关键词定义的全局变量不属于 window 对象
    • 在相同的作用域,或在相同的块中,通过 let 重新声明一个 var/let 变量是不允许的
    • 在相同的作用域,或在相同的块中,通过 var 重新声明一个 let 变量是不允许的
    • 在不同的作用域或块中,通过 let 重新声明变量是允许的
  • 提升(Hoisting)是 JavaScript 将声明移至顶部的默认行为

    • 函数声明
      • 使用表达式定义的函数不会被提升
    • 变量声明
      • 通过 var 声明的变量会提升到顶端
      • 通过 let 定义的变量不会被提升到顶端
  • "use strict"; 严格模式

    • 不允许在不声明变量(对象)的情况下使用变量(对象)
    • 不允许删除(delete)变量、对象、函数
    • 不允许重名参数
    • 不允许八进制
    • 不允许转义字符
    • 不允许写入只读属性、写入只能获取的属性、删除不可删除的属性
    • 字符串 "eval","arguments" 不可用作变量
    • 处于安全考虑,不允许 eval() 在其被调用的作用域中创建变量
    • 不允许 with 语句
    • 不允许使用为未来预留的关键词
  • 调试

    • console.log()
    • debugger
  • 请避免全局变量、new、===、eval()

    • 请使用 {} 来代替 new Object()
    • 请使用 "" 来代替 new String()
    • 请使用 0 来代替 new Number()
    • 请使用 false 来代替 new Boolean()
    • 请使用 [] 来代替 new Array()
    • 请使用 /()/ 来代替 new RegExp()
    • 请使用 function (){}来代替 new Function()
  • 注意!

    • if (typeof myObj !== "undefined" && myObj !== null 判断是否未定义
    • 用字符串减去字符串,不会产生错误而是返回 NaN
    • 延迟 JavaScript 加载,defer="true" 延迟加载,只适用于外部脚本
posted @ 2021-03-28 17:17  Zeiion  阅读(135)  评论(0)    收藏  举报