Javascript 为什么没有id的元素上的element.id不返回undefined或null?

Javascript 为什么没有id的元素上的element.id不返回undefined或null?,javascript,jquery,dom,Javascript,Jquery,Dom,受类似情况的启发,我想知道是否有人能解释决定让element.id在id属性不存在时返回空字符串的原因 如果规范返回null或undefined,我只需编写 var allIds = $('#my-frm input').map(function() { return this.id; }).get(); 相反,我必须向选择器添加一个限定符,如 var allIds = $('#my-frm input[id]').map(function() { return this.id; }).get

受类似情况的启发,我想知道是否有人能解释决定让element.id在id属性不存在时返回空字符串的原因

如果规范返回
null
undefined
,我只需编写

var allIds = $('#my-frm input').map(function() { return this.id; }).get();
相反,我必须向选择器添加一个限定符,如

var allIds = $('#my-frm input[id]').map(function() { return this.id; }).get();
或者使用针对上述问题提出的其他解决方案(如果id存在,则必须获取两次)

或者我可以使用jquery属性getter,这似乎没有必要先将每个元素包装到jquery对象中,但我之所以提到它是为了完整性,并说明jquery使用.attr()方法的方向正好相反

我很好奇javascript元素.id行为背后是否有实际原因

更新: 我最终找到了相关的规范,它定义了当前的行为(它没有解释为什么会这样定义)

当创建的元素具有值不是空字符串的
id
属性时,或者当元素的
id
属性设置为空字符串以外的值时,将元素的id设置为新值

当元素的
id
属性被删除或设置为空字符串时,取消设置元素的id


某些IDL属性定义为反映给定名称的特定内容属性。这意味着获取时,必须运行以下步骤:

  • 使用内容属性的名称获取上下文对象的属性,并将值作为结果

  • 如果值为null,则返回空字符串。

  • 返回值

  • 在设置时,使用属性名称和给定值为上下文对象设置属性

    id
    属性必须反映“
    id
    ”内容属性

    我很好奇javascript背后是否有实际原因 element.id行为

    Element.id
    属性表示元素的标识符, 反映全局属性


    如果规范返回
    null
    未定义

    标识符是不透明的字符串。特定含义不应被忽略 从id属性的值派生

    注意对于ID的形式没有其他限制;特别是,ID可以仅由数字组成,以数字开头, 以下划线开头,仅由标点符号等组成

    注意元素的唯一标识符可用于多种用途,最显著的是作为链接到元素特定部分的方式 使用片段标识符作为元素目标的一种方式来记录文档 在编写脚本时,以及作为从CSS设置特定元素样式的一种方式


    有趣的是,结果与意图正好相反。因为我 希望避免调用单独的方法来检查
    id

    $.map()
    替换为
    .map()
    ,将
    数组.prototype.filter()
    替换为
    .get()
    的参数
    布尔值
    ,以返回非空字符串的
    id

    var allIds = $.map($("input"), function(el) {
                   return el.id
                 }).filter(Boolean);
    

    jsfiddle

    是否
    返回this.id | | null希望返回空值时返回空值?不能先使用
    filter
    ?空字符串是错误的。。。为什么要空值?
    我很好奇是否有实际原因
    -历史?改变它会破坏万维网太多吗?为什么重要?@JaromandaX的+1。你让我笑了。别担心,我不想改变它,也不想冒险破坏整个www.@RudigerW。请注意,这与编程语言JavaScript完全无关——这是一个涉及标准化web API的W3C项目。原则上这些不是特定语言。谢谢参考!有趣的是,结果与意图正好相反。因为我想避免调用一个单独的方法来检查
    id
    的存在,我最终给了
    空字符串
    值特殊的含义;b) 减少方法调用;c) 返回不是空字符串的元素的
    id
    ?不确定问题是否仅限于为什么
    id
    未设置时返回空字符串,或者如何返回
    id
    元素中存在的位置,或者如何减少方法调用?因此,您引用的规范部分实际上没有说明属性不存在时的值。否则就会自相矛盾<代码>该值在元素的主子树中的所有id中必须是唯一的,并且必须至少包含一个字符。
    那么,所有没有id属性的元素现在都返回空字符串,该空字符串1)不唯一2)长度至少不超过一个字符。@RudigerW。我认为根本问题可能是所有元素都有一个“id”属性,而且
    null
    实际上不是W3CDOM标准的概念。@RudigerW。等等-你已经找到了规格。你在问什么?你是在问为什么规格是这样的吗?
    var allIds = $('#my-frm input').map(function() { return $(this).attr('id'); }).get();
    
    interface Element : Node {
      readonly attribute DOMString? namespaceURI;
      readonly attribute DOMString? prefix;
      readonly attribute DOMString localName;
      readonly attribute DOMString tagName;
    
               attribute DOMString id;
               attribute DOMString className;
    ...
    
    var allIds = $.map($("input"), function(el) {
                   return el.id
                 }).filter(Boolean);