javascript重点-数据类型

本文详细介绍了JavaScript中的数据类型,包括基本数据类型和引用数据类型,并深入探讨了隐式转换的规则及其应用场景,同时讲解了包装对象的概念及类型检测方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、六种数据类型 (弱类型数据)

1.基本数据类型(5种):Undefined、Null、Boolean、Number、String

2.引用数据类型(1种):Object  例如: Function Date Array ...

在js中定义变量的时候无需指定类型。比如定义一个变量 var num = 16, 而此时我们也可以把一个字符串赋值给这个变量 num = "this is a string",这样也是合法的。那可能有的朋友觉得js好简单,定义变量的时候连类型是什么都不用管,是这样的吗?那下面我们来看一下:

  (1).  16 + 16 的运算结果是什么呢,这个很简单是 32

  (2). 我们把第一个 16 用双引号引起来,理解为字符串。 "16" + 16 的运算结果是什么呢,还是 32 吗?肯定不是啦,此时这里的理解为字符串拼接,答案为 “1616” 这样一个字符串。

  (3). 我们继续看同样是那如果同样是字符串或者是数字,我们把 + 变成 -,"16" - 16 此时运算结果是什么呢? 答案是 0。这里的理解为数字的运算所以答案就是0。

  小结:js在定义一个变量的时候虽然不用指定变量的数据类型,但是在涉及到操作符等等的一些运算的时候,背后往往有很多的隐式转换逻辑。

 

二、隐式转换 (+ 和 -,== 和 ===)

1.借着上面提到的我们举一个例子:

   "16" + 6   // "166"  (字符串拼接)

   "16" - 6   // 10 (数字运算)

  我们往往可以利用(+/-)规则来进行转换类型。

  比如:我们想把变量num 转换成数字类型,一个非常简单的方法我们就可以 num - 0。又或者我们想把num转换成 String 类型,我们该怎么办呢,对就是加一个空的字符串 num + ""。

2. == 和 ===

  (一)、相等运算符 (==)

    1、如果一个值是null,另一个是undefined,则它们相等。

    2、如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值比较。

    3、如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将基转换为0再进行比较。

    4、如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值,然后再进行比较。对象通过toString()方法或valueOf()方法转换为原始值。JavaScript核心的内置类首先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只使用toString()转换。那些不是JavaScript语言核心中的对象则通过各自的实现中定义的方法转换为原始值。

    5、其他不同类型之间的比较均不相等.

    例如: null == undefined, //true

        “16” == 16,  //true

          0 == false, //true

        [1,2] == [1,2],  //false

        new Object() == new Object(),  //false

          new Object().toString() == new Object().toString(),   //true

        new String("aaa") == "aaa",  //true

        new String("11") == 11,  //true 

  (二)、严格等于(===)

    1、首先判断他们的类型,如果两个值类型不相同,则它们不相等,直接返回 false。   

      // “16” === 16,  //false

    2、如果两个值都是null或者都是undefined,则它们才相等。

       //   null === null, //true,   undefined=== undefined, //true    undefined === null  //false

    3、如果两个值都是布尔值true或false,则它们相等。

    4、如果其中一个值是NaN,或者两个两个值都是NaN,则它们不相等。NaN和其他任何值都是不相等的,包括它本身!!!通过x!==x来判断x是否为NaN,只有在x为NaN的时候,这个表达式的值才为true。

    5、如果两个值为数字,且数值相等,则它们相等。如果一个为0,另一个为-0,则它们同样相等。

    6、如果两个值为字符串,且所含的对应位上的16位数完全相等,则它们相等。如果它们的长度或内容不同,则它们不等。两个字符串可能含义完全一样且所显示出手字符也一样,但具有不同编码的16位值。JavaScript并不对Unicode进行标准化的转换,因此像这样的字符串通过"==="和"=="运算符的比较结果也不相等。

    7、如果两个引用值同一个对象、数组或函数,则它们是相等的。如果指向不同的对象,则它们是不等的。尽管两个对象具有完全一样的属性。

 

三、包装对象

      定义:在JavaScript中,“一切皆对象”,数组和函数本质上都是对象,就连三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。

通俗来讲:字符串,数值,字符串,这些单身狗看其它人都有对象,非常不爽,所以自己也搞了个对象,名字叫包装。

1.一般来说,只有对象是可以对属性进行读写操作的。但是聪明的骚年,你有没有发现,平时我们用得很多的字符串方法和属性,都是直接通过”.”操作符访问的。比如:

  console.log("hello world".length);
  console.log("this a string".indexOf("a"));

2.其实,在我们调用这些方法和属性时,JS内部已经隐式地帮我们帮创建了一个包装对象了,以上的实际的情形应该是这样的:

  console.log(new String("hello world").length);
  console.log(new String("this a string").indexOf("a"));

3.但是两者还是有区别的,
  区别1:
  浏览器自己隐式创建的包装对象和你显式创建的包装对象不严格相等。简单来说,虽然说表面JS对亲生的与领养的一样,但实际上,亲生的不等于领养的。

    var a1 = "test",
        a2=new String("test");
    console.log(a1 == a2);//true
    console.log(a1 === a2);//false

  区别2:
  隐式创建的包装对象,在使用完后之后就会被抛弃了。简单来说就是,一个大大的负心汉,上完我,就抛弃,还重新去找其他对象。
  拿我们开头的那道题来说:
    test.a = "hello";
  这里隐式创建了一个包装对象,所以这里赋值不会报错。
    console.log(test.a);
  这里之前的包装对象已经被抛弃了,但是使用了"."运算符,所以又创建一个新的包装对象,但是这个对象的属性a并没有赋值,所以属性a的值是undefined。

  说到实际运用中,有的浏览器性能不是很好,比如说低版本IE,当频繁处理字符串时,效率会很低。所以很多时候,我们还不如直接显式地创建包装对象,防止浏览器过多地创建隐式的包  装对象,提升性能。

    //不推荐使用种方法
    var example = "this is a example";  
    //推荐使用这种方法,提升性能。
    var example2 = new String("this is a example");

四、类型检测

  在js中检测类型的方法有很多,比如 typeof、instanceof、Object.prototype.toString、constructor、duck type

  1. typeof 运算符,有两种方式 typeof + 检测目标 或者 typeof (检测目标),该方法适用于基本数据类型和函数的检测(遇到null失效),返回的结果都是字符串

    typeof 100    “number”

    typeof true   “boolean”

    typeof("hello")  "String"

    typeof Function   “Function”

    typeof undefined  “undefined”

    typeof null  “Object”  历史遗留的问题,为了兼容

    typeof NaN  “number”   判断NaN的方法可以用isNaN(NaN)来判断,如果返回true就是NaN

    typeof new Object()   “Object”

    typeof [1,2]   "Object"

    大家可能注意到了,typeof在检测对象类型的时候是无法区分的,此时我们就要用第二种方法instanceof

  2.instanceof运算符(适用于自定义对象或者原生对象数据类型的检测),基于原型链的类型检测

    比如判断一个对象是不是数组: [1,2] instanceof Array 返回 true

    obj instanceof Object   :它期望左操作数obj 是一个对象,如果是一个数字1,2,3或者true,false时就会直接返回false。

                 它期望右操作数是一个函数对象或者是函数构造器,如果不是就会抛出Typeerror异常

    instanceof 工作的一个大概的原理就是它会判断左操作数这样一个对象的原型链上是否有右边这个构造函数的prototype属性

    我们举一个例子:

      function Person(){}

      function Student(){}

      Student.prototype = new Person();

      Student.protype.constructor = Student

      var a = new Person();

      var b = new Student();

      -----------------------------------------

      a instanceof Person   // true

      b instanceof Student   //true

      a instanceof Student   //false

      b instanceof Person    //true

    注意:不同window之间和跨iframe之间是不可以使用instanceof的,虽然看着是同一个对象但是在不同window之间和跨iframe之间是不同的对象,每个iframe下都有自己的一套原型链,跨frame实例化的对象彼此是不共享原型链,因此会返回false

  3.Object.prototype.toString 函数方法

    Object.prototype.toString.call()或者Object.prototype.toString.apply()

    例如:

    Object.prototype.toString.call([])     //"[object Array]"

    Object.prototype.toString.call(function(){})  //"[object Function]"

    Object.prototype.toString.call(undefined)  //"[object Undefined]"

    Object.prototype.toString.call(null)      //"[object Null]"

 

    注意:1.解决了跨iframe 失效的问题

       2.IE 6,7,8下  Object.prototype.toString.call(null或undefined)      //"[object Object]"

  4.constructor方法

    function A(){}; 

    function B(){};  

    A.prototype = new B(); 

    var aObj = new A(); 

    --------------------------------

    aObj.constructor === B; //true;  

    aObj.constructor === A; //false;

        注意:类继承时会出现问题

  5.duck type(鸭子类型)

    比如检测数组时,我们可以检测他有没有push()方法等等

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值