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]';};
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

软考50-上午题-【数据库】-SQL访问控制

一、SQL访问控制 数据控制,控制的是用户对数据的存储权力,由DBA决定。 DBA:数据库管理员。 DBMS数据控制应该具有一下功能: 1-1、授权语句格式 说明: 示例: 1-2、收回权限语句格式 示例: PUBLI…

海外社媒营销:动态住宅代理IP的妙用

动态代理IP,顾名思义,是一种可以动态变化的IP地址。与传统的静态IP地址不同,动态代理IP在每次网络请求时都能提供一个新的IP地址。在进行海外推广活动时,它的应用非常关键。 动态代理IP的工作原理基于一个庞大的IP地址池。当用户…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因,以及介绍名为ZString的库,它可以将字符串生成的内存分配为零。 在C#中,字符串拼接通常有三种方式: 直接使用号连接;string.format;使用StringBuilder; 下面分别细…

基于springboot的4S店车辆管理系统源码和论文

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

使用 gregwar/captcha 生成固定字符的验证码

图片验证码生成失败 $captcha new CaptchaBuilder("58 ?"); $code $captcha->getPhrase();\Cache::put($key, [phone > $phone, code > $captcha->getPhrase()], $expiredAt);$captcha->build(); $result [captcha_key > $key,expired_at >…

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构,相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics,又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

深入浅出JVM(十六)之三色标记法与并发可达性分析

上篇文章深入浅出JVM(十五)之垃圾回收器(上篇)介绍性能指标吞吐量和延迟、串行收集器、并行收集器以及吞吐量优先收集器 为了更好的描述并发垃圾收集器,本篇文章将先深入浅出的介绍三色标记法以及并发可达性分析遇到的…

批量获取图片(中)

1.图片标签 img是图片标签;alt是对图片标签的描述 2.获取网页内容 接下来,使用requests模块和BeautifulSoup模块请求并解析网页内容。 在爬取新的网页内容前,我们需要导入requests模块,请求并查看状态码。 拿到网页源代码后&am…

账户名密码是怎样被窃取的,简单模拟攻击者权限维持流程。

前言 在我们进行渗透测试的时候,常常需要进行权限维持,常见的 Javascript窃取用户凭证是一种常见的攻击手法。之前我们可能学习过钓鱼网页的使用,如果我们通过渗透测试进入到用户的服务器,其实也可以通过在网页中植入Javascript代…

JavaEE:多线程(3):案例代码

目录 案例一:单例模式 饿汉模式 懒汉模式 思考:懒汉模式是否线程安全? 案例二:阻塞队列 可以实现生产者消费者模型 削峰填谷 接下来我们自己实现一个阻塞队列 1.先实现一个循环队列 2. 引入锁,实现线程安全 …

揭秘「 B 站最火的 RAG 应用」是如何炼成的

近日,bilibili 知名科技 UP 主“Ele 实验室”发布了一个视频,标题为“当我开发出史料检索 RAG 应用,正史怪又该如何应对?” 。 视频连续三天被平台打上“热门”标签,并迅速登上科技板块全区排行榜前列。截至目前&#…

尚硅谷webpack5笔记2

Loader 原理 loader 概念 帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块。 loader 执行顺序 分类pre: 前置 loadernormal: 普通 loaderinline: 内联 loaderpost: 后置 loader执行顺序4 类 loader 的执行优级为:pre > normal > inline > post 。相…

Springboot+vue图书管理系统(小白)

图书管理系统 简介:一个最简约的图书管理系统,适用于小白用来练手 前端:VueElementUIechars 后端:SpringbootMybatisMySQL 功能模块: 信息管理:公告信息 操作日志 用户管理:用户信息 图书…

IntelliJ IDEA下Spring Boot多环境配置教程

🌟🌌 欢迎来到知识与创意的殿堂 — 远见阁小民的世界!🚀 🌟🧭 在这里,我们一起探索技术的奥秘,一起在知识的海洋中遨游。 🌟🧭 在这里,每个错误都…

基于51单片机烟雾报警器数码管显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机烟雾报警器数码管显示( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0067 1. 主要功能: 基于51单片机的烟雾报警器proteus仿真设…

Spring中 Unsupported class file major version 61 报错

初学Spring时遇到的一个错误&#xff1a;Unsupported class file major version 61 &#xff0c;如图所示&#xff1a; 网上查了一下大概是JDK的版本与Spring的版本不一致导致的错误&#xff1b;刚开始我用的Spring版本是&#xff1a; <dependencies><dependency>…

PostgreSQL教程(十一):SQL语言(四)之数据类型

一、数值类型 数值类型由 2 字节、4 字节或 8 字节的整数以及 4 字节或 8 字节的浮点数和可选精度的十进制数组成。 下表列出了所有可用类型。 数值类型 名字存储长度描述范围smallint2 字节小范围整数-32768 到 32767integer4 字节常用的整数-2147483648 到 2147483647bigi…

个人建站前端篇(七)vite + vue3企业级项目模板

一、vite命令行创建项目 npm create vitelatest根据提示选择模板&#xff0c;选择vite vue3 ts即可。 二、项目连接远程仓库 git init git remote add origin https://gitee.com/niech_project/vite-vue3-template.git git pull origin master git checkout -b dev三、项目…

【GPU驱动开发】-mesa简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; 一、mesa介绍 Mesa是OpenGL、Vulkan和其他图形API规范的开源实现。主要由Intel和AMD为其各自的硬件开发和资助。 AMD 在已弃用的AMD Catalyst上推广其 Mesa 驱动程序 Radeon 和 RadeonSI &…

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号&#xff0c;单个字符 转义字符是一种特殊的字符变量&#xff0c;以反斜线开头&#xff0c;后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…