ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

JS中的数据类型

(一)、基本数据类型(值类型)

1.number:数字

-12、12.5、-12.5 0这些数字都是number;
js中增加了一个number类型的数据:‘NaN’
typeof NaN ->“number”

①"NaN"

not a number:不是一个数,但是属于number类型NaN == NaN :false NaN和任何其它值都不相等

②"isNaN() "

用来检测当前这个值是否是有效数字,如果不是有效数字,检测的结果是true;反之为false
isNaN(0)->false
isNaN(NaN)->trueisNaN(‘12’)–>false 当我们使用isNaN检测值的时候,检测的值不是number类型的,浏览器会默认的把值转化为number类型,然后再去检测

661fb5d2a5e6f22c29085ab82dd432ed.png

③"Number()"

把其它数据类型值转化为number类型的值;
Number(‘12’) ->12
Number(‘12px’) ->NaN 在使用Number转换的时候只要字符串中出现一个非有效数字字符,最后结果都是NaN;

b89062dd99f5be6a147fd25d5b3f77cb.png

④Number([])

把引用数据类型转换为number,首先把引用数据类型转换为字符串(toString),在把字符串转换为number即可 例如:[]->’’ ‘’->0

24670b5d0fef829f926a4fa9ac41a340.png

⑤ ‘parseInt()’

把其它数据类型转换为number,和Number方法在处理字符串的时候有区别

57f4de671a8c9c65a877df242f1246be.png

parseInt(‘12px13’) -->12 提取规则:从左到右依次查找有效数字字符,直到遇见非有效数字字符为止(不管后面是否还,有都不找了),把找到的转换为数字parseInt(‘px12’) ->NaN

⑥parseFloat()

在parseInt的基础上可以识别小数点

ac182221004596f13f3bc4a8658b29e7.png

2. string:字符串

-'zhufeng' '珠穆朗玛峰' ->单双引号包裹起来的都是字符串(单双引号没有区别)字符串常用方法charAt charCodeAtsubstr substring slicetoUpperCase toLowerCaseindexOF lastindexOfsplitreplacereplacematch

3. boolean:布尔类型( 只有true 和false俩个值`)

Boolean()

把其它数据类型的值转换为布尔类型
只有“0,NaN,空字符串、null,undefined”这五个数据值转换成布尔类型的false,其余的都为true

98e37cb478dba8ec3c43d6aed990158e.png

'!'

!=;不等于
叹号在JS中还有一个作用:取反,先把值转换成布尔类型,再去取反

b00771533bc6e4a7a1371035df520548.png

③ ‘!!’

在一个叹号取反的基础上在取反,取俩次反相当于没有任何操作,但是已经把其他类型值转换为布尔类型了,和Boolean是相同的效果

e508b364b917e4e107b9b19836a088b5.png

4. (null):空对象指针(null是空对象,不是(null),因为不加(),null就是个空对象,不显示了)

现在没有, 以后会有的, 空指针对象

5. undefined:未定义

压根就没有过,现在没有以后也没有0

(二)、引用数据类型

引用数据类型(应运而生){} [] Date RegExp fn .

1.object对象数据类型

对象 是复合数据的载体, 用{}包起来, 内容是一对一对的键值对(属性名: 属性值)
这里的冒号相当于 等号 是赋值的意思,不同的键值对之间用逗号隔开③ 属性名 对应 咱们变量名 (但是属性名可以是数字,也不能是数字开头的字符)④: 对应咱们的 等号⑤ /属性值 对应咱们的 变量的值(可以是任意的数据类型)

var per = { c
        "name":'zfpx',
        1:'wwww',
        age:9,
        bol: true,
        hobby:{
            hobby1:'play',
            hobby2: 'read'
        },
        fn: function () {

        }
    };
    var per2 = {
        name:'小明',
        'name':'小红',
        age:12,
        age: 15,
        2:13,
        '2':18
    };
    console.log(per2["name"],per2.name);

对象的 增 删 改 查

(1)查
如果属性名是数字的话 我们再获取该属性对应的属性值的时候只能用 [] 的这种方式(属性名可以带引号 也可以不带引号(不区分单双); 带不带引号,表示的都是一个属性)

// 1、 打点的方式 (从属关系)
    per.name;
    console.log(per2[2]);//当属性名是数字的时候 我们只能用 [] 的方式获取
    //2、中括号的方式
    console.log(per['name']);

       var name1 = 'age';
    console.log(per[name1],per.name1,per["name1"],per[1],per["1"]);
    var name2 = 'hobby';
    console.log(per[name2].hobby1,per.name,per["bol"]);
    console.log(per[name2][12222222]);
    console.log(per[name2]['hobby1']);
    per[name] //--> per['age'] -- > 9  per.age



    //定义属性时,属性名的引号可带可不带
    //调用时,若是通过打点的方式获取某个属性对应的值,我们不能给这个属性加引号
    //若是通过 [] 的方式获取某个属性对应的值,我们必须用引号把这个属性名包起来
    //如果不用引号包起来,则 [] 内代表的是变量对应的值;
    //若属性名是数字的时候, 我们必须用 [] 的方式获取该属性对应的值,这时的数字属性名的引号可加可不加

(2)给对象添加 一项()

var user = {
        name:'xiaoming',
        password:'1234'
    };

(3)修改对象(直接给属性名重新赋值)

user.name = 'xm1';

当这个对象里边有这个属性的时候,我们再重新赋值时,是相当于修改这个属性对应的属性值
当这个对象里边没有这个属性时,我们给这个属性赋值时,就相当于给这个对象添加了这个属性(4)对象的属性的删除
1、真删除 2、假删除

fc7ccdeaeb7dc489e033e4f1502ba50a.png

2. [] 数组

数组的每一项都有一个属性名(数组本身就是一个对象,他只是对象的一个细分)跟他对应。这里的属性名(依次递增的数字) 我们叫做索引
数组对象的作用是:使用单独的变量名来存储一系列的值。

[12,23,34]
  var ary = [1,true,'qqq',null,undefined,{q:1},function(){console.log(2)},sum,sum()];

var ary2 = [sum,sum()];// [sum,NaN]
    var  t = sum();//NaN
    var ary3 = [sum,t,'t'];//[sum,NaN,'t']
    // 数组里的变量,我们是要把对应的变量值放到相应的位置

    // obj[name]

    //对象中的查看 打点  ['']
    // 数组本身也因该有打点和 [''] 两种方式 ,但是 对象中 数字的属性名,我们只能用 [''][]的方式,所以数组中的查看我们只能用 [''][]
    // console.log(ary['8'],ary[8]);

3. 正则

正则:就是用来处理字符串的一种规则
处理字符串的两种方式
一种是匹配 test; 编写了一个正则;用这个正则去查看这个字符串是否满足你的规则;
另一种是捕获 exec;编写一个正则;然后去字符串中获取满足你规则的字符串
-/^-?(d|([1-9]d+))(.d+)?$/ /*匹配有效数的正则*/

var reg = /-/;//字面量的声明定义方式
    var reg2 = new RegExp('-');// 构造函数式的定义方式
    console.log(reg, reg2);
    console.log(reg == reg2);//false

    //用上边字面量方式 生成的正则 ;两个斜杠中的内容叫做 元字符
    var reg = / /;


    // 元字符  修饰符
    // 修饰符
    // i ignoreCase : 忽略大小写
    // m multiline : 多行匹配
    // g global : 全局匹配

    //特殊意义的元字符
    //  :转义的意思; 把在正则里有特殊意义的字符 转成 字符本身
    // . :除了换行以外的所有字符;
    // d: 代表 0~9 之间的数字
    // D: 代表除了0~9以外的字符
    // w: 数字 字母 下划线
    // |W: 除了 数字 字母 下划线 以外的字符
    //[a-z]:a到z之间的任意字母
    //[A-Z]:
    //[A-z]
    //[abc]: a,b,c中的任意一个
    // a|b : a或者b
    //[^abc]: 除了 abc 以外的任意字符
    //[^a-z]: 除了 小写字母 以外的任意字符

    // 量词元字符
    var reg = /d+/;
    // + : 代表前边的字符出现一次或者多次
    // * :代表前边的字符出现零次或者多次
    // ? : 代表前边的字符出现零次或者一次
    //{n}: 代表前边的字符出现n次
    //{n,}:代表前边的字符最少出现n次
    //{n,m}:代表前边的字符出现 n到m次

    //^  $
    var reg = /^d+$/; //23424253
    //^ 代表字符串以什么开头
    //$ 代表字符串以什么结尾

    // () 在正则里边代表分组
    // ?: -–> 代表只匹配 不捕获
    // ?= -–> 正向预查
    // ?! -–> 负向预查
    // s : 空白符
    // n : 换行符

4. function函数数据类型

//我们要用函数的原因
    // 1、 节省代码
    // 2、 高内聚(把东西缩到一块,这一块就是为了实现某个功能,跟其他代码没有任何联系) 低耦合(跟其他代码没关联)

    // 函数的 语法

    /*
    * 1、function 函数名(){
    *      函数体
    * }
    *
    * 2、var 函数名 = function [函数名-可写可不写](){
    *       函数体
    * }
    *
    * 第一种声明方式, 我们在声明的代码的之前调用这个函数
    * 第二种声明方式,  我们只能在声明的代码之后调用
    *
    * 函数声明之后 可以无限次调用
    *
    * return //返回的意思
    *
    * */
    clearRoom();//函数的调用  -->  函数名()

    function clearRoom() {
        console.log('收拾桌子');
        console.log('收拾卧室');
        console.log('出门');
    }

    // clearRoom();

    // clearPer();

    var clearPer  = function (){
        console.log('洗脸');
        console.log('刷牙');
        console.log('穿鞋');
        return '出门';// return 什么 那函数执行完 返给外界的就是啥
    };
    var a = clearPer();//把函数执行的结果赋值给 a
    console.log(a);
    // clearPer();

检测数据类型方法

1. typeof: 检测数据类型的运算符

使用typeof检测,返回的结果是一个字符串,字符串中包含的内容证明了值是属于什么类型的;【局限性】
①.typeof null 不是‘null’而是’object’,因为null虽然是单独的一个数据类型,但是它原本意思就是空对象指针,浏览器使用typeof检测的时候会把它按照对象来检测;
②.使用typeof无法具体细分出到底是数组还是正则,因为返回的结果都是’object’

typeof  12 => 'number'

var num =12;
typeof num => 'number'

课外扩展(腾讯面试题)

console.log(typeof typeof [])
typeof [] ->‘object’
typeof “object” -> “string”

2. instanceof:检测某个实例是否属于这个类

3. constructor 获取当前实例的构造器

4. Object.prototype.toString.call:获取当前实例的所属类信息

作者:志若鸿鹄,尺步寸微
链接:前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法_志若鸿鹄,尺步寸微的博客-CSDN博客_前端基本数据类型
来源:CSDN

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值