js 常见报错 | js 获取数据类型 | js 判断是否是数组

文章目录

  • js 常见报错
    • 1.1 SyntaxError(语法错误)
    • 1.2 ReferenceError(引用错误)
    • 1.3 RangeError(范围错误)
    • 1.4 TypeError(类型错误)
    • 1.5 URLError(URL错误)
    • 1.6 手动抛出错误
  • js 获取数据类型
    • 1.1 typeof
      • 注意
    • 1.2 Object.prototype.toString.call()
      • 注意
    • 1.3 instanceof
      • 判断自定义类型
    • 1.4 constructor
      • 判断自定义类型
    • 封装打印所有类型
  • js 判断是否是数组
    • instanceof、constructor不好的原因
    • isArray
      • 封装方法

今天菜鸟整理自己的 goole 书签栏,突然发现,看着确实挺有用,通过标题大致就知道是什么内容,大致就知道了什么时候可以帮助菜鸟解决什么问题,没用的或者太简单的就删除了。

但是菜鸟转念一想,发现菜鸟脑子里是一点印象都没有,如果用的时候来找的话,找得到还好,找不到就像考试作弊,明明考试前还看见了,但是一到考试就找不到答案在哪里的感觉,心态直接炸了。

而且感觉一些基础,即使不好记,也真的需要记在脑子里,而不是书签里,所以就把几个菜鸟感觉很重要、很常用的,这里做个总结,俗话说:好记性不如烂笔头,也希望可以帮助读者!

js 常见报错

建议熟悉单词:

  • Invalid 无效
  • unexpected 意外的
  • defined 未定义
  • property 属性

也要熟记这后面的几个错误单词!!!

1.1 SyntaxError(语法错误)

解析代码时发生的语法错误

var 1a;   //Uncaught SyntaxError: Invalid or unexpected token 无效或意外的标识符 - 变量名错误
console.log 'hello');  //Uncaught SyntaxError: Unexpected string 意外的字符串 - 缺少括号

1.2 ReferenceError(引用错误)

console.log(a);  //Uncaught ReferenceError: a is not defined a未定义 - 引用了一个不存在的变量
console.log()= 1;  //Uncaught ReferenceError: Invalid left-hand side in assignment 将变量赋值给一个无法被赋值的对象

1.3 RangeError(范围错误)

var a = new Array(-1);  //Uncaught RangeError: Invalid array length 无效长度 - 超出有效范围

1.4 TypeError(类型错误)

变量或参数不是预期类型,比如,对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数

var a = new 123;  //Uncaught TypeError: 123 is not a function

调用不存在的方法

var a;
a.aa();  //Uncaught TypeError: Cannot read property 'aa' of undefined

1.5 URLError(URL错误)

与url相关函数参数不正确,主要是encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。

decodeURI('%2')  //Uncaught URIError: URI malformed at decodeURI

1.6 手动抛出错误

以上这 5 种派生错误,连同原始的Error对象都是构造函数。开发者可以使用它们,人为生成错误对象的实例。

throw new Error("出错了!"); 
throw new RangeError("出错了,变量超出有效范围!"); 
throw new TypeError("出错了,变量类型无效!");

上面代码表示新建错误对象的实例,实质就是手动抛出错误。可以看到,错误对象的构造函数接受一个参数(可以是对象),代表错误提示信息。

菜鸟还有一种报错没总结,感觉常用,更多参考:JS中常见的几种报错类型

js 获取数据类型

js 的数据类型

ES6以前。6种:Undefined、Null、Number、Boolean、String、Object
ES6标准。7种:Undefined、Null、Number、Boolean、String、Symbol、Object
ES2020标准。8种:Undefined、Null、Number、Boolean、String、Symbol、BigInt、Object

以下是用于测试的各种类型(不包括 BigInt 类型):

var a = 123,
  b = true,
  c = "123",
  d = undefined,
  e = null;
var o = new Object();
var f = new Function();
var f1 = function () {};
function f2() {}
var arr = [];
var arr1 = new Array();
var reg = new RegExp();
var sy = Symbol();

1.1 typeof

可以判断 js 中基本数据类型,但无法判断对象的具体类型

代码:

console.log("a:" + typeof a);
console.log("b:" + typeof b);
console.log("c:" + typeof c);
console.log("d:" + typeof d);
console.log("e:" + typeof e);
console.log("o:" + typeof o);
console.log("f:" + typeof f);
console.log("f1:" + typeof f1);
console.log("f2:" + typeof f2);
console.log("arr:" + typeof arr);
console.log("arr1:" + typeof arr1);
console.log("reg:" + typeof reg);
console.log("sy:" + typeof sy);

结果:
在这里插入图片描述

注意

当使用基本包装类型创建字符串、数组或布尔值时,使用typeof返回的是Object
在这里插入图片描述
判断基本类型

function ccTypeof(cc){
  return cc === null ? "null" : typrof(cc);
}

1.2 Object.prototype.toString.call()

可以判断具体的对象类型,包括正则等

代码:

console.log("a:" + Object.prototype.toString.call(a));
console.log("b:" + Object.prototype.toString.call(b));
console.log("c:" + Object.prototype.toString.call(c));
console.log("d:" + Object.prototype.toString.call(d));
console.log("e:" + Object.prototype.toString.call(e));
console.log("o:" + Object.prototype.toString.call(o));
console.log("f:" + Object.prototype.toString.call(f));
console.log("f1:" + Object.prototype.toString.call(f1));
console.log("f2:" + Object.prototype.toString.call(f2));
console.log("arr:" + Object.prototype.toString.call(arr));
console.log("arr1:" + Object.prototype.toString.call(arr1));
console.log("reg:" + Object.prototype.toString.call(reg));
console.log("sy:" + Object.prototype.toString.call(sy));

结果:
在这里插入图片描述

注意

无法判断自定义对象类型

function A() {
  return 111;
}
var x = new A();
console.log(Object.prototype.toString.call(x));

该代码结果为
在这里插入图片描述
而不是预期的 A

1.3 instanceof

用法:变量 instaceof 对象,返回值为boolean

仅能判断对象类型的具体类型,undefined 和 null 报错,但可以拥于判断自定义对象类型。

在这里插入图片描述
改成小写也不行,报错:

Uncaught TypeError: Right-hand side of ‘instanceof’ is not an object

null 同理!

代码:

console.log(a instanceof Number);
console.log(b instanceof Boolean);
console.log(c instanceof String);
console.log(o instanceof Object);
console.log(f instanceof Function);
console.log(f1 instanceof Function);
console.log(f2 instanceof Function);
console.log(arr instanceof Array);
console.log(arr1 instanceof Array);
console.log(reg instanceof RegExp);
console.log(sy instanceof Symbol);

结果·:
在这里插入图片描述

判断自定义类型

代码:

function A(){
 this.a = 1;
}
function B(){
 this.b = 2;
}
var x = new A();
if(x instanceof A){
  console.log("x is A");  
}
if(x instanceof B){
  console.log("x is B");  
}else{
  console.log("x is not B"); 
}

结果:
在这里插入图片描述

1.4 constructor

查看对象对应的构造函数,object 的每个实例都具有属性 constructor,保存着用于创建当前对象的函数,和 instaceof 一样,undefined 和 null 报错,但是比 instaceof 功能更强大。

代码:

console.log(a.constructor === Number);
console.log(b.constructor === Boolean);
console.log(c.constructor === String);
console.log(o.constructor === Object);
console.log(f.constructor === Function);
console.log(f1.constructor === Function);
console.log(f2.constructor === Function);
console.log(arr.constructor === Array);
console.log(arr1.constructor === Array);
console.log(reg.constructor === RegExp);
console.log(sy.constructor === Symbol);

结果:
在这里插入图片描述

判断自定义类型

代码:

function A() {
  this.a = 1;
}
function B() {
  this.b = 2;
}
var x = new A();
if (x.constructor == A) {
  console.log("x is A");
}
if (x.constructor == B) {
  console.log("x is B");
} else {
  console.log("x is not B");
}

结果:
在这里插入图片描述

封装打印所有类型

function ccTypeof(cc){
  var typeName == Object.prototype.toString.call(cc);
  if( typeName == "[object Object]"){
      typeName = "[object" + cc.constructor.name + "]";
   }
}

js 判断是否是数组

有了上述学习,可以轻易的知道有 3 种方式可以知道是否为 Array ,分别为:Object.prototype.toString.call()、instanceof 、constructor,但是其实 instanceof 、constructor 不是特别好。

instanceof、constructor不好的原因

instanceof 运算符用于检验构造函数的 prototype 属性是否出现在对象的原型链中的任何位置,返回一个布尔值。

需要注意的是,prototype 属性是可以修改的,所以并不是最初判断为true就一定永远为真

其次,当我们的脚本拥有多个全局环境,例如:html中拥有多个iframe对象,instanceof的验证结果可能不会符合预期

//为body创建并添加一个iframe对象
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//取得iframe对象的构造数组方法
xArray = window.frames[0].Array;
//通过构造函数获取一个实例
var arr = new xArray(1,2,3); 
arr instanceof Array;//false

导致这种问题是因为 iframe 会产生新的全局环境,它也会拥有自己的 Array.prototype 属性,让不同环境下的属性相同很明显是不安全的做法,所以 Array.prototype !== window.frames[0].Array.prototype,想要 arr instanceof Array 为 true,你得保证 arr 是由原始 Array 构造函数创建时才可行。

constructor 也有该问题!

isArray

虽然 Object.prototype.toString.call() 没有上述问题,但是这么长的一串确实不好记,其实 js 已经考虑到了这些,所以为我们提供了更加方便的方法:isArray!

简单好用,而且对于多全局环境,Array.isArray() 同样能准确判断,但有个问题,Array.isArray() 是在ES5中提出,也就是说在ES5之前可能会存在不支持此方法的情况。

封装方法

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410709.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用二维码高效收集信息?表单功能轻松实现

表单作为草料二维码的高级功能之一,可用于收集格式统一的数据。你可以通过组合姓名、图片、检查项等组件搭建出电子表单,关联到二维码中,扫码填写表单即可更快速、规范的收集数据。 下面为大家介绍下表单的制作教程。 1、新建表单 新建表单…

跨区域复制建筑UI输入框脚本迷你世界

--复制区域文件 --设置坐标起点,终点 --创建区域 --获取坐标id,data --星空露珠工作室制作 local pos1{x-16,y7,z28} local pos2{x28,y44,z-9} local block{num0} local str{} local str0{} local num0 local count0 local ui6 --几个输入框 local romath.random(…

辽宁博学优晨教育视频剪辑培训探索学习新意义

在当今数字化快速发展的时代,视频已成为信息传达的重要载体。辽宁博学优晨教育视频剪辑培训应运而生,不仅为学员提供了专业的学习平台,更在探索学习的意义方面赋予了新的内涵。 视频剪辑作为现代媒体行业的重要技能,其学习意义不仅…

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够”

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够” 关于武汉三类人员(安全员ABC)考试小题库,一般都是考试时间出来,准考证下来了,匹配题库,好好看题(认真练习即可),一般…

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…

微信小程序(四十五)登入界面-简易版

注释很详细,直接上代码 上一篇 此文使用了vant组件库,没有安装配置的可以参考此篇vant组件的安装与配置 新增内容: 1.基础组件的组合 2.验证码倒计时的逻辑处理 源码: app.json {"usingComponents": {"van-field…

数据结构知识点总结-绪论 数据结构基本术语 算法及评价

要求 (1)对数据结构这么课学了哪些知识有个清楚的认知; (2)掌握目录结构,能复述出来每个知识点下都有哪些内容。 如下图所示,可自行制作思维导图,针对自己薄弱的地方进行复习。 …

签三方协议?大家一定要注意的问题!

签三方协议?大家一定要注意的问题! 一、三方协议是什么?二、签三方协议要注意什么?1、待遇问题2、发展机会3、违约金 三、三方协议的一些疑问?1、三方协议和劳动合同的区别?2、签了三方会失去应届生身份嘛&…

Bentley全球COO康岷思:中国市场特别且重要

吴付标 疫情之后,中国再次敞开国门,欢迎四海友人。Bentley全球首席运营官康岷思正是其中的一位。 康岷思三年前加入Bentley管理团队。笔者在2023年10月份在新加坡召开的纵览基础设施大会暨光辉大奖盛典上第一次见到他。中国基础设施数字化先锋们所讲述的…

Vue:基本命令的使用(代码 + 效果)

文章目录 Hello Vue!el: 挂载点datamethods vue命令v-textv-htmlv-on v-showv-ifv-bindv-forv-model Hello Vue! <!DOCTYPE html> <html><head><title>Hello Vue!</title></head><body><div id"app">{{ message }}…

RabbitMq:RabbitMq消息中的相关处理 ③

一、解耦思想 在 RabbitMQ 在设计的时候&#xff0c;特意让生产者和消费者分离&#xff0c;也就是消息的发布和消息的消费之间是解耦的。 生产者与消费者之间的直连&#xff0c;少了很多的灵活性和策略的制定。还有一种解耦的思想存在。 二、消息的可靠性保证与性能关系 消息的…

Nacos简易示例

目录 步骤&#xff1a; 1. 下载并启动 Nacos Server 2. 创建用户订单微服务 2.1 创建 Spring Boot 项目 2.2 添加依赖 2.3 配置 Nacos 2.4 编写业务逻辑 3. 注册服务到 Nacos 4. 测试服务 Nacos 是一个开源的服务发现和配置管理系统&#xff0c;可以用于微服务架构中的…

QT数据库

八、数据库 准备工作 Qt本身并没有数据库功能&#xff0c;但是Qt支持调用其他主流的数据库产品。并且这些数据库产品指定了统一的Qt接口&#xff0c;实际上是一种数据库的中间件。 Qt支持以下数据库类型&#xff1a; 嵌入式常用的数据库式SQLite3&#xff0c;本体只有几兆大小&…

Linux进程 ----- 信号处理

前言 从信号产生到信号保存&#xff0c;中间经历了很多&#xff0c;当操作系统准备对信号进行处理时&#xff0c;还需要判断时机是否 “合适”&#xff0c;在绝大多数情况下&#xff0c;只有在 “合适” 的时机才能处理信号&#xff0c;即调用信号的执行动作。 一、信号的处理…

什么是代码签名证书中的“硬证书”?

代码签名证书是用于验证和签名软件程序的一种数字证书。使用代码签名证书&#xff0c;可以保护代码完整性、防止非法篡改&#xff0c;标识软件发行商的身份并确保软件来源可信。按不同验证级别&#xff0c;代码签名证书分为扩展验证型EV代码签名证书、企业验证型OV代码签名证书…

babylonjs入门模

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff1a;464146715 官方文档 中文文档 最小模版 ​ 代码如下&#xff1a; 在react中使用 import React, { FC, useCallback, useEffect, useRef, useState } f…

LINE封号全面解析:原因、判断方法与申诉渠道

在LINE中被封锁有两个方面&#xff1a;一是你被好友屏蔽&#xff0c;另一是遭到平台官方的封锁。通常用户会用“停权”来代表LINE的官方封锁&#xff0c;在实际操作上&#xff0c;所谓的停权并不意味着你的账户完全无法使用&#xff0c;只是没办法与好友发送消息&#xff0c;更…

聊一聊EGO-Planner膨胀系数的大小对无人机避障飞行的影响

EGO-Planner简介 EGO-Planner作为业界知名的无人机轨迹规划算法&#xff0c;其优势在于能够在复杂环境中快速规划出安全、平滑且动态可行的飞行轨迹。在这个算法中&#xff0c;膨胀系数发挥着关键作用。它通过扩大障碍物的感知范围&#xff0c;提供额外的安全边距&#xff0c;…

如何使用Lychee+cpolar搭建本地私人图床并实现远程访问存储图片

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…