Javascript 为什么innerText和setItem在JS中的语法不同?
Javascript 为什么innerText和setItem在JS中的语法不同?,javascript,Javascript,setItem的语法类似于setItem(key,value),但innerText的语法类似于innerText=“text”。为什么不像setItem(key)=value那样使用setItem?有什么技术原因吗?技术原因是因为我们称之为rvalue和lvalue之间的差异。rvalue是可以出现在赋值=运算符右侧的表达式。同样地,左值可以出现在左侧。在这种情况下,像setItem(key)这样的函数调用是一个rvalue,不能出现在=的左侧。DOM(和其他)API公开功能有两种常见的方式。
setItem
的语法类似于setItem(key,value)
,但innerText
的语法类似于innerText=“text”
。为什么不像setItem(key)=value那样使用setItem
?有什么技术原因吗?技术原因是因为我们称之为rvalue
和lvalue
之间的差异。rvalue
是可以出现在赋值=
运算符右侧的表达式。同样地,左值可以出现在左侧。在这种情况下,像setItem(key)
这样的函数调用是一个rvalue
,不能出现在=
的左侧。DOM(和其他)API公开功能有两种常见的方式。其中一种方法是使用=
指定给属性:
someElm.textContent = 'foo';
someElm.onclick = () => console.log('clicked');
另一种常用方法是调用函数:
localStorage.setItem(key, value);
someElm.addEventListener('click', () => console.log('clicked'));
事情就是这样。一些开发人员发现使用一种或另一种方法比只使用其中一种方法更方便
请注意,也可以使用=
更改存储,而无需调用setItem
。例如,以下两种方法执行相同的操作:
sessionStorage.setItem('prop', 'val');
sessionStorage.prop = 'val';
基于函数的方法非常容易理解-调用该方法的对象将该方法作为属性,因此可以通过传递所需的参数来调用
基于=
的方法有点奇怪。下面发生的是=
正在调用setter。如果检查属性描述符,您可以看到:
console.log(Object.getOwnPropertyDescriptor(HTMLElement.prototype,'innerText')
setItem
是一个方法,innerText
是一个属性.setItem(…)
是一个方法调用,您不能为其分配任何内容。事实上,您可以改为使用localStorage.key=value
,但它不太安全(至少在理论上)。很多OO语言都有相同的区别,getter和setter方法通常是用来防止无效值的。在这种情况下,“语法”一词是不正确的用法。