Javascript工作中学习到的

本文探讨了JavaScript中数组的字符串和数值索引特性,强调了添加字符串下标实际上是在数组对象上添加属性。此外,详细介绍了undefined的转换规则以及与null的区别。还讨论了条件判断时的真假值处理。接着,讲解了Object.keys()、Object.values()等方法的用法,以及setter和getter的概念。最后,提到了this的关键作用,Map与Object的区别,以及各种for循环的使用场景。

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

JS中数组字符串索引和数值索引

首先明确JS中数组的length=最大索引+1,工作发现数组索引居然还能字符串,找到了一篇写的特别好的文章记录一下
JS中数组字符串索引和数值索引研究

总结

  1. Javascript的数组其实不像PHP或者其他一些语言一样拥有真正的字符串下标,当我们试图为一个js数组添加字符串下标的时候,其实就相当于为该数组对象添加了一个属性,属性名称就是我们所谓的“字符串下标”。由于为数组对象添加属性不会影响到同为该对象属性的length的值,因此length将始终为零。同样地,.pop()和.shift()等作用于数组元素的方法也不能够作用于这些对象属性。因此,如果要使用的是一个完全由“字符串下标”组成的数组,那还是将其声明为一个Object类型的对象要更好一些。
  2. Javascript数组下标值的范围为0到2的32次方。对于任意给定的数字下标值,如果不在此范围内,js会将它转换为一个字符串,并将该下标对应的值作为该数组对象的一个属性值而不是数组元素,例如array[-1] = “yes” 其实就相当于给array对象添加了一个名为-1的属性,属性值为yes。
    如果该下标值在合法范围内,则无论该下标值是数字还是数字字符串,都一律会被转化为数字使用,即 array[“100”] = 0 和 array[100] = 0 执行的是相同的操作。同理也会影响长度。隐式类型转换
let h=[];
h['100']=1;
console.log(h);
console.log(h.length);
console.log(h['100']);
console.log(h[100]);

数组索引

JS里的undefined

这个真的很绕口

console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(undefined==false);
console.log(null==false);

null,undefined,false
讲道理嘛
就很无语,你转换成Boolean是false,你==判断不就是转换同一类型再比较值吗,怎么就!=了???
==的准则
但是为什么这样我是没整明白

undefined与null

undefined==null
undefined!==null(一个type undefined,一个type object)

undefined,null与false,true

console.log(undefined!=true);
console.log(undefined!=false);
console.log(undefined!==true);
console.log(undefined!==false);
console.log(null!=false);
console.log(null!=true);
console.log(null!==false);
console.log(null!==true);

!==完全可以理解
但是注意,==的情况下,也就是只比较值的情况下!!!
这两个!=false,!=true。总之就是自己,颜色不一样的烟火。

总结

一篇讲js里相等的非常好的博客
js谈相等
在这里插入图片描述
一般不要使用相等操作符,全等操作符很容易理解

所以做条件判断的时候js的真假?

true:非空,非0

‘0’ true

const str='0';
console.log('0'==false);
if(str){
  console.log("if");
}
else{
  console.log("else");
}

在这里插入图片描述
特别绕口,数值转换值相等,但是他!!!条件判断的时候真
记住条件判断要非0非空就真,所以null,undefined都会转false那个分支,但这不代表nullfalse,undefinedfalse,只是他们!=true

我好蠢呀,条件判断的本质:将()内statement转化成bool值,Boolean(xxx)
我管什么undefined,null这些是什么?
首先慎用==,很奇怪,用全相等
然后转成Boolean,undefined,null,0就是false;'0’是true,秀

console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean(0));
console.log(Boolean(new Object());
console.log(Boolean('0'));

在这里插入图片描述

false

const str=null;
console.log(null==false);
if(str){
  console.log("if");
}
else{
  console.log("else");
}

输出false,else

const str=undefined;
console.log(undefined==false);
if(str){
  console.log("if");
}
else{
  console.log("else");
}

输出false,else
所以谁真谁假?

undefined,null,
输出false,if

总结

  1. ==不能说明什么,因为做了类型转化,而且很奇怪的判断逻辑
    所以用三个=
  2. 最重要的条件判断是把()里转换成Boolean,由布尔值决定走哪个分支,别想复杂

文档

==原理
stackoverflow针对null!=true也!=false的讨论
js文档谈相等

一些方法

Object.keys()

借鉴博客:Object.keys()
返回数组,里面元素通通字符串

  • Object:返回属性名,字符串形式
var data={a:1,b:2,c:9,d:4,e:5};
    console.log(Object.keys(data));//["a", "b", "c", "d", "e"]
});
  • 字符串:返回索引
var str = 'ab1234';
console.log(Object.keys(obj));  //["0","1","2","3","4","5"]
  • 数组:返回索引
var arr = ["a", "b", "c"];
    console.log(Object.keys(arr)); // console: ["0", "1", "2"]
  • 函数:同Object
function Pasta(name, age, gender) {
      this.name = name;
      this.age = age;
      this.gender = gender;
      this.toString = function () {
            return (this.name + ", " + this.age + ", " + this.gender);
    }
}

console.log(Object.keys(Pasta)); //console: []

var spaghetti = new Pasta("Tom", 20, "male");
console.log(Object.keys(spaghetti)); //console: ["name", "age", "gender", "toString"]

Object.values()

返回Object可枚举属性值的数组,与for…in顺序一样(唯一区别:for…in循环还枚举了原型链中的属性)
与Object.keys()有那种对应的感觉

可不可枚举,本身可以认为,属性也是object,所以属性这个object有一个属性,可不可枚举enumerable

const obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]

// Array-like object
const arrayLikeObj1 = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(arrayLikeObj1 )); // ['a', 'b', 'c']

// Array-like object with random key ordering
// When using numeric keys, the values are returned in the keys' numerical order
const arrayLikeObj2 = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(arrayLikeObj2 )); // ['b', 'c', 'a']

// getFoo is property which isn't enumerable
const my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = 'bar';
console.log(Object.values(my_obj)); // ['bar']

// non-object argument will be coerced to an object
console.log(Object.values('foo')); // ['f', 'o', 'o']

注意这个顺序,和string的特殊性

  • 属性名为数值的属性,是按照数值大小,从小到大遍历的
  • 对可枚举属性的理解,这个可以改,一般有默认
  • 字符串会先转成一个类似数组的对象,字符串的每个字符,就是该对象的一个属性。因此,Object.values返回每个属性的键值,就是各个字符组成的一个数组

一篇写的非常清楚的博客Object.keys,values,entries详解
这三个对map比较常用。

Object.create()

找到了一篇写的非常清楚的文章,多看看这个就可以了Object.create(…)

Object.freeze()

冻结一个对象。不能被修改,不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
Object.freeze()文档

Object属性

去拿一个Object没有的属性,得到undefined,老规矩了,记清楚

JS里的setter,getter

setter

在 javascript 中,如果试着改变一个属性的值,那么对应的 setter 将被执行。setter 经常和 getter 连用以创建一个伪属性。不可能在具有真实值的属性上同时拥有一个 setter 器。
更详细:setter文档

getter

伪属性

const obj = {
  log: ['example','test'],
  get latest() {
    if (this.log.length == 0) return undefined;
    return this.log[this.log.length - 1];
  }
}
console.log(obj.latest); // "test".

注意,尝试为latest分配一个值不会改变它。

详细:getter文档

const {id, title, optionName, options, isCustomized} = this.props;

解构赋值
解构赋值语法是一种 Javascript 表达式。通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量

更细致讲解:
javascript的文档
stackoverflow回答这个问题

Javascript中的this,超级重要

this文档

Map和Object的区别

Map文档
Map和Object的区别
第二个博客我还没验证正确与否,不懂写的对不对好不好

四个for循环

PR中不断改进,要写出优美的代码,对js里的for循环应该术业有专攻
参考非常好的blog:
js中for-in和for-of
js四种for循环
js数组遍历方法的对比

总结:

标准for循环
for-in:术业有专攻,专门用来遍历对象的属性
forEach:对数组每个有效值执行一次callback函数
for-of:
遍历范围:数组,类数组对象(eg:DOM nodelist),字符串,Map,set
不支持普通对象
与keys().entries(),values()结合

其他循环方法

js数组循环
map:不改变原数组,返回新数组
reduce:js之reduce的最全用法
filter:不改变原数组,返回新数组,只要true的
every:检测,全true则true,有一个false返回false 必须全对
some:检测,全false则false,有一个true立即返回true 有一些对就好

【object Object]

js输出内容为[object,Object]
toString()的原理
当被object调用?
见到+出现?自觉调用toString()
都能在这个blog找到答案

最后

整理就是为了看,经常看,多记录感悟。这些是我不懂或者踩过坑记录一下,毕竟对于javascript我真的初学者中的初学者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值