我有一个函数服务,使用加载程序中的数据,并以正确的方式对其进行转换,然后返回新数据 我建议使用“?”在转换之前返回数据,如果没有来自加载程序的数据,这可能会很有意义:
export default async function serviceInputSearch(url) {
const data = await new DataLoader(url).get();
return data?.data.results;
}
我在Google中找不到有关此“?”的任何信息。在回报声明中? 什么意思?
答案 0 :(得分:4)
这称为可选链接。您可以在这里找到有关此信息的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining。
但是,在您的示例中,要点是问号可以验证是否存在有效的“数据”对象。如果您那里没有问号,并且没有数据对象或它为null,则在“无法读取'undefined'的属性数据”行中将引发错误。
答案 1 :(得分:3)
const adventurer = {
name: 'Alice',
cat: {
name: 'Dinah'
}
};
// you can use it to check if the property is exist in the object
const dogName = adventurer.dog?.name; //same as adventurer.dog && adventurer.dog.name ? adventurer.dog.name : undefined;
console.log(dogName); //undefined
否则您可以将其用于检查/调用对象内部功能的存在性
// if someNonExistentMethod is exists in the adventurer Object call it.
console.log(adventurer.someNonExistentMethod?.());
语法是
const adventurer = {
name: 'Alice',
cat: {
name: 'Dinah'
},
skills: ['jump']
};
obj.val?.prop => //Optional chaining
ex: adventurer.dog?.name
obj.val?.[expr] => //Optional chaining with expressions
ex: const propertyName = 'name'; adventurer.dog?.[propertyName];
obj.arr?.[index] => //Array item access with optional chaining
ex: adventurer.skills?.[0] //jump
obj.func?.(args) => //Optional chaining with function calls
ex: adventurer.someNonExistentMethod?.()
答案 2 :(得分:3)
它是“可选链接”运算符。
这里是一个用例:
let obj = {};
console.log(obj?.person?.age);
console.log(obj.person.age);
如果您尝试访问不存在的属性,它将很方便。其undefined
,因此您会收到错误cannot get xx of undefined
为防止此错误,请在其前面放置一个?.
,它将返回一个undefined
而不是抛出错误
这里有一些例子:
let obj = {};
//method does not exist
console.log(obj.func?.())
let arr = ["tom"];
console.log(arr[2]?.name);
let matrix = [ [ 1 ], [ 2 ] ];
console.log(matrix[5]?.[3]);
let defaultName = obj?.name ?? "Tom";
console.log(defaultName);
答案 3 :(得分:2)
它是可选的链接运算符。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
答案 4 :(得分:0)
在Javascript中,我们需要显式检查每个引用以确保已定义。如果我们在一个对象中有一个嵌套很深的引用,它可能看起来像这样:
let networkFetchResult = await fetch("https://myfriends.com/user/123").then(res => res.json());
// Let's assume that the first friend of our request user is our best friend
let bestFriendsName = networkFetchResult
&& networkFetchResult.data
&& networkFetchResult.data.user
&& networkFetchResult.data.user.friends
&& networkFetchResult.data.user.friends[0]
&& networkFetchResult.data.user.friends[0].name
|| "You don't have any friends!";
相反,您只能这样做
let networkFetchResult = await fetch("https://myfriends.com/user/123").then(res => res.json());
// Still assuming that our first friend is our best friend
let bestFriendsName = networkFetchResult?.data?.user?.friends?.[0]?.name || "You don't have any friends!";