みなさん、こんにちは!JavaScriptでundefinedを判定する方法について知りたいと思っていませんか?このガイドでは、初心者の方でも理解できるように、undefinedの基本から応用まで、具体例を交えて丁寧に解説していきます。undefinedって何なの?どうやって判定するの?そんな疑問にお答えしていきますよ。さあ、一緩に学んでいきましょう!
undefinedの基本概念:JavaScriptにおける未定義値の役割と重要性
まずは、undefinedについての基本的な概念から始めましょう。JavaScriptを使っていると、このundefinedという言葉をよく目にすると思います。でも、実際どんな意味があるのでしょうか?undefinedは、変数が宣言されているけれど、まだ値が割り当てられていない状態を表す特別な値なんです。これがなぜ重要なのか、どんな場面で使われるのか、具体例を交えて見ていきましょう。
typeof演算子を使用したundefined判定:最も一般的で信頼性の高い方法
さて、undefinedを判定する方法の中で、最も一般的で信頼性が高いのが「typeof演算子」を使う方法です。これ、本当に便利なんですよ。
例えば、こんなコードを見てください:
let myVar;
console.log(typeof myVar); // "undefined"と出力されます
このように、変数を宣言しただけで値を代入していない場合、typeofを使うとちゃんと”undefined”と教えてくれるんです。すごくシンプルでしょ?
でも、ここで注意してほしいことがあります。nullという値があるんですが、これもundefinedに似ていて、初心者の方はよく混乱しちゃうんです。
let myNullVar = null;
console.log(typeof myNullVar); // "object"と出力されます!
えっ?”object”って出てきちゃいました。これ、JavaScriptの昔からのバグなんです。面白いでしょ?だから、nullかどうかを判定したい時は、別の方法を使う必要があります。
typeof演算子は本当に便利なんですが、こういった落とし穴もあるんです。でも心配しないでください。次は、もっと厳密な判定方法を見ていきますね。
typeof null との違い:undefinedとnullの判定を正確に区別する技術
さっき見たように、typeofを使うとnullの判定でちょっとした問題が起きちゃいますよね。でも大丈夫、undefinedとnullをきちんと区別する方法があるんです。
まず、厳密等価演算子(===)を使う方法があります:
let myUndefinedVar;
let myNullVar = null;
console.log(myUndefinedVar === undefined); // true
console.log(myNullVar === null); // true
これなら、undefinedとnullをしっかり区別できますね。
でも、もっと賢い方法もあるんです。Object.isメソッドを使うと、もっと正確に判定できます:
console.log(Object.is(myUndefinedVar, undefined)); // true
console.log(Object.is(myNullVar, null)); // true
この方法だと、NaNの判定なんかもできちゃうんです。すごいでしょ?
結局のところ、undefinedとnullは似ているけど違う概念なんです。undefinedは「値が割り当てられていない」状態で、nullは「意図的に値が存在しない」状態を表します。この違いを理解しておくと、コードをもっと正確に書けるようになりますよ。
厳密等価演算子(===)によるundefined判定:より厳密な比較方法
さて、次は厳密等価演算子(===)を使ったundefinedの判定方法について詳しく見ていきましょう。これ、本当に便利な方法なんですよ。
まず、基本的な使い方はこんな感じです:
let myVar;
if (myVar === undefined) {
console.log("myVarはundefinedです");
}
簡単でしょ?でも、ここで気をつけてほしいことがあります。JavaScriptには、緩い等価演算子(==)というのもあるんです。これを使うと、ちょっと予想外の結果になることがあります:
console.log(undefined == null); // true
console.log(undefined === null); // false
えっ?最初のがtrueになっちゃいました。これ、緩い等価演算子(==)を使うと、JavaScriptが勝手に型変換をしちゃうからなんです。だから、undefinedを判定するときは、必ず厳密等価演算子(===)を使うようにしましょうね。
それから、関数の引数がundefinedかどうかを判定するときも、この方法が使えます:
function myFunction(arg) {
if (arg === undefined) {
console.log("引数が渡されていません");
} else {
console.log("引数: " + arg);
}
}
myFunction(); // "引数が渡されていません"と出力
myFunction("こんにちは"); // "引数: こんにちは"と出力
こんな風に使えば、関数に引数が渡されたかどうかもチェックできるんです。便利でしょ?
厳密等価演算子(===)を使えば、undefinedをしっかり判定できるし、思わぬバグも防げます。コードを書くときは、この===を使う習慣をつけるといいですよ。
loose equality(==)との比較:型変換を避けてundefinedを正確に判定する重要性
さっき少し触れた緩い等価演算子(==)について、もう少し詳しく見ていきましょう。これ、使い方を間違えると思わぬトラブルの元になるんです。
例えば、こんなコードを見てください:
console.log(undefined == null); // true
console.log(undefined == false); // false
console.log(undefined == 0); // false
console.log(undefined == ""); // false
最初の比較がtrueになっちゃいましたね。これ、緩い等価演算子(==)を使うと、JavaScriptが勝手に型変換をして比較しちゃうからなんです。
でも、厳密等価演算子(===)を使えば:
console.log(undefined === null); // false
console.log(undefined === false); // false
console.log(undefined === 0); // false
console.log(undefined === ""); // false
全部falseになります。これなら安心ですね。
だから、undefinedを判定するときは、必ず厳密等価演算子(===)を使うようにしましょう。こうすれば、思わぬバグを防げるし、コードの意図もはっきりします。
それに、こんな使い方もできるんです:
function greet(name) {
if (name === undefined) {
console.log("こんにちは、名無しさん!");
} else {
console.log("こんにちは、" + name + "さん!");
}
}
greet(); // "こんにちは、名無しさん!"と出力
greet("太郎"); // "こんにちは、太郎さん!"と出力
こんな風に使えば、引数が渡されたかどうかをチェックして、それに応じた処理ができるんです。便利でしょ?
結局のところ、undefinedを正確に判定することは、バグを防いだり、コードの意図をはっきりさせたりするのに本当に大切なんです。だから、ちょっと面倒くさくても、===を使う習慣をつけるといいですよ。きっと、より良いコードが書けるようになりますから。
高度なundefined判定テクニック:エッジケースと特殊な状況への対応
さて、ここからは少し難しくなりますが、より高度なundefined判定のテクニックについて見ていきましょう。基本的な判定方法を押さえたら、次はこういった特殊なケースにも対応できるようになると、もっとプロフェッショナルなコードが書けるようになりますよ。具体的には、オブジェクトのプロパティの判定や、関数のパラメータの扱い方など、実際のコーディングでよく遭遇する場面での対処法を学んでいきます。難しく感じるかもしれませんが、一緒に頑張っていきましょう!
オブジェクトのプロパティ存在確認:hasOwnPropertyメソッドとin演算子の活用
オブジェクトのプロパティが存在するかどうかを確認するのって、結構難しいんです。でも、大丈夫。ちゃんとした方法があるんですよ。
まず、hasOwnPropertyメソッドを使う方法があります:
let myObject = { name: "太郎", age: 30 };
console.log(myObject.hasOwnProperty("name")); // true
console.log(myObject.hasOwnProperty("job")); // false
このメソッドを使うと、オブジェクト自身が直接持っているプロパティかどうかを確認できます。便利でしょ?
でも、ちょっと注意が必要です。というのも、プロトタイプチェーンを通じて継承されたプロパティは、falseになっちゃうんです。
そこで登場するのが、in演算子です:
console.log("name" in myObject); // true
console.log("job" in myObject); // false
console.log("toString" in myObject); // true
in演算子を使うと、継承されたプロパティも含めて確認できます。”toString”がtrueになったのは、これがObjectプロトタイプから継承されているからなんです。
じゃあ、どっちを使えばいいの?って思いますよね。実は、状況によって使い分けるのがベストなんです。自分のオブジェクトだけのプロパティを確認したいならhasOwnProperty、継承されたものも含めて確認したいならinを使うといいでしょう。
それから、こんな方法もあります:
if (myObject.job === undefined) {
console.log("jobプロパティは存在しません");
}
これでも判定はできますが、注意が必要です。プロパティが存在していて、たまたまundefinedが代入されている場合も同じ結果になっちゃうんです。
だから、より安全な方法としては、こんな感じで書くこともあります:
if (!("job" in myObject) || myObject.job === undefined) {
console.log("jobプロパティは存在しないか、undefinedです");
}
これなら、プロパティの存在確認と値の確認を両方できますね。
結局のところ、状況に応じて適切な方法を選ぶのが大切です。オブジェクトの構造やプロジェクトの要件をよく考えて、最適な方法を選んでいきましょう。
undefinedと未定義プロパティの区別:より精密な判定方法の実装
さて、ここからはもう一歩踏み込んで、undefinedと未定義プロパティの区別について見ていきましょう。これ、ちょっと難しいかもしれませんが、理解できると本当に役立つんです。
まず、こんなコードを見てください:
let obj1 = { prop: undefined };
let obj2 = {};
console.log(obj1.prop === undefined); // true
console.log(obj2.prop === undefined); // true
どちらもtrueになりましたね。でも、実は状況が違うんです。obj1は’prop’というプロパティを持っていて、その値がundefinedなんです。一方、obj2は’prop’というプロパティ自体を持っていません。
この違いを区別するには、こんな方法があります:
function checkProperty(obj, prop) {
if (prop in obj) {
if (obj[prop] === undefined) {
return "プロパティは存在しますが、値はundefinedです";
} else {
return "プロパティは存在し、値は" + obj[prop] + "です";
}
} else {
return "プロパティは存在しません";
}
}
console.log(checkProperty(obj1, 'prop')); // "プロパティは存在しますが、値はundefinedです"
console.log(checkProperty(obj2, 'prop')); // "プロパティは存在しません"
こうすれば、プロパティの存在と値をきちんと区別できますね。
さらに、ES2015以降では、Object.getOwnPropertyDescriptorというメソッドも使えます:
function detailedCheck(obj, prop) {
let descriptor = Object.getOwnPropertyDescriptor(obj, prop);
if (descriptor) {
if (descriptor.value === undefined) {
return "プロパティは存在し、値はundefinedです";
} else {
return `プロパティは存在し、値は${descriptor.value}です`;
}
} else {
return "プロパティは存在しません";
}
}
let obj1 = { prop: undefined };
let obj2 = {};
let obj3 = { prop: "こんにちは" };
console.log(detailedCheck(obj1, 'prop')); // "プロパティは存在し、値はundefinedです"
console.log(detailedCheck(obj2, 'prop')); // "プロパティは存在しません"
console.log(detailedCheck(obj3, 'prop')); // "プロパティは存在し、値はこんにちはです"
このメソッドを使うと、プロパティの詳細な情報が得られるんです。値だけでなく、そのプロパティが書き込み可能かどうかとか、列挙可能かどうかとか、そういった情報まで取得できちゃいます。
例えば、こんな使い方もできます:
let obj = {};
Object.defineProperty(obj, 'hiddenProp', {
value: "秘密の値",
enumerable: false
});
let descriptor = Object.getOwnPropertyDescriptor(obj, 'hiddenProp');
console.log(descriptor.enumerable); // false
console.log(descriptor.value); // "秘密の値"
こんな風に、普通の方法では見えないプロパティの情報まで取得できるんです。すごいでしょ?
ただ、この方法も完璧というわけではありません。継承されたプロパティは見つけられないんです。そういう場合は、さっき見たin演算子と組み合わせて使うといいでしょう。
function fullCheck(obj, prop) {
if (prop in obj) {
let descriptor = Object.getOwnPropertyDescriptor(obj, prop);
if (descriptor) {
return `直接のプロパティで、値は${descriptor.value}です`;
} else {
return "継承されたプロパティです";
}
} else {
return "プロパティは存在しません";
}
}
こんな風に組み合わせれば、より詳細な情報が得られますね。
結局のところ、undefinedと未定義プロパティの区別は、コードの正確性を高める上でとても大切なんです。状況に応じて、これらの方法を使い分けていくといいでしょう。少し複雑に感じるかもしれませんが、慣れてくると本当に便利なテクニックなんです。頑張って使いこなしていきましょうね!
関数パラメータのundefined判定:デフォルト引数と組み合わせた効果的な使用法
さて、次は関数のパラメータでundefinedを判定する方法について見ていきましょう。これ、実際のコーディングでよく使う技なんです。
まず、基本的な方法からいきますね:
function greet(name) {
if (name === undefined) {
name = "名無しさん";
}
console.log(`こんにちは、${name}!`);
}
greet(); // "こんにちは、名無しさん!"
greet("太郎"); // "こんにちは、太郎!"
こんな感じで、引数がundefinedかどうかをチェックして、デフォルト値を設定できます。でも、ES6からはもっと簡単な方法があるんです。
function greet(name = "名無しさん") {
console.log(`こんにちは、${name}!`);
}
greet(); // "こんにちは、名無しさん!"
greet("花子"); // "こんにちは、花子!"
これ、すごく便利でしょ?引数がundefinedの場合に自動的にデフォルト値が使われるんです。
でも、ここで注意してほしいことがあります。nullを渡した場合は、デフォルト値は使われません:
greet(null); // "こんにちは、null!"
これ、意外と気づきにくいんですよね。
それから、デフォルト引数を使うときは、順番にも気をつける必要があります:
function createUser(name = "名無しさん", age = 20, job) {
console.log(`名前: ${name}, 年齢: ${age}, 職業: ${job}`);
}
createUser(undefined, undefined, "プログラマー");
// "名前: 名無しさん, 年齢: 20, 職業: プログラマー"
このように、undefinedを明示的に渡すことで、途中の引数だけをデフォルト値にすることもできるんです。
さらに、デフォルト引数には式も使えるんです:
function greet(name = getName()) {
console.log(`こんにちは、${name}!`);
}
function getName() {
return "ゲストさん";
}
greet(); // "こんにちは、ゲストさん!"
これなら、もっと複雑な処理も可能になります。例えば、こんな使い方もできるんです:
function createUser(name = "名無しさん", age = 20, job = `${name}の仕事`) {
console.log(`名前: ${name}, 年齢: ${age}, 職業: ${job}`);
}
createUser(); // "名前: 名無しさん, 年齢: 20, 職業: 名無しさんの仕事"
createUser("太郎"); // "名前: 太郎, 年齢: 20, 職業: 太郎の仕事"
こんな風に、他の引数を使ってデフォルト値を設定することもできるんです。面白いでしょ?
それから、関数のパラメータが多い場合は、オブジェクトを使う方法もありますよ:
function createProfile({name = "名無しさん", age = 20, job = "未設定"} = {}) {
console.log(`名前: ${name}, 年齢: ${age}, 職業: ${job}`);
}
createProfile(); // "名前: 名無しさん, 年齢: 20, 職業: 未設定"
createProfile({name: "花子", job: "エンジニア"}); // "名前: 花子, 年齢: 20, 職業: エンジニア"
この方法だと、引数の順番を気にせずに、必要な情報だけを渡せるんです。便利ですよね。
でも、ここで一つ注意点があります。引数にundefinedを渡した場合と、引数を省略した場合は、少し挙動が違うんです:
function showValue(value = "デフォルト") {
console.log(value);
}
showValue(undefined); // "デフォルト"
showValue(); // "デフォルト"
function hasParameter(param = "デフォルト") {
console.log(arguments.length);
}
hasParameter(undefined); // 1
hasParameter(); // 0
見てわかるように、undefinedを明示的に渡した場合は、引数が存在していると判断されるんです。これ、知っておくと役立つことがありますよ。
結局のところ、関数パラメータのundefined判定とデフォルト引数の組み合わせは、コードをより柔軟で読みやすくするのに役立ちます。状況に応じて、これらのテクニックを使い分けていくといいでしょう。
最初は少し複雑に感じるかもしれませんが、使っているうちに自然と身についていきますよ。どんどん試してみてくださいね。きっと、より効率的で柔軟なコードが書けるようになりますから!
可変長引数関数でのundefined判定:argumentsオブジェクトを用いた高度なテクニック
さて、ここからはもう一歩進んで、可変長引数関数でのundefined判定について見ていきましょう。これ、ちょっと難しいかもしれませんが、使いこなせるようになると本当に便利なんです。
まず、argumentsオブジェクトについて説明しますね。これ、関数に渡されたすべての引数を含む配列みたいなオブジェクトなんです。こんな感じで使えます:
function showArgs() {
console.log(arguments.length); // 引数の数
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]); // 各引数の値
}
}
showArgs("こんにちは", 42, true);
// 出力:
// 3
// こんにちは
// 42
// true
これを使えば、引数の数が不定の関数でも、すべての引数にアクセスできるんです。
でも、ES6以降では、もっと便利な方法があります。レストパラメータというものです:
function showArgs(...args) {
console.log(args.length); // 引数の数
args.forEach(arg => console.log(arg)); // 各引数の値
}
showArgs("こんにちは", 42, true);
// 出力は同じ
こっちの方が使いやすいですよね。
さて、これを使ってundefinedの判定をする方法を見ていきましょう:
function processValues(...values) {
values.forEach((value, index) => {
if (value === undefined) {
console.log(`引数${index + 1}はundefinedです`);
} else {
console.log(`引数${index + 1}の値は${value}です`);
}
});
}
processValues(1, undefined, "こんにちは", null);
// 出力:
// 引数1の値は1です
// 引数2はundefinedです
// 引数3の値はこんにちはです
// 引数4の値はnullです
こんな風に、すべての引数に対してundefined判定ができるんです。
それから、デフォルト値と組み合わせることもできます:
function greetPeople(greeting = "こんにちは", ...names) {
if (names.length === 0) {
console.log(`${greeting}、みなさん!`);
} else {
names.forEach(name => {
if (name === undefined) {
console.log(`${greeting}、名無しさん!`);
} else {
console.log(`${greeting}、${name}さん!`);
}
});
}
}
greetPeople(); // こんにちは、みなさん!
greetPeople("やあ", "太郎", undefined, "花子");
// やあ、太郎さん!
// やあ、名無しさん!
// やあ、花子さん!
これなら、挨拶の言葉をカスタマイズしつつ、複数の人に対応できますね。
最後に、ちょっと高度なテクニックを紹介しますね。関数の引数の型をチェックする関数を作ってみましょう:
function typeCheck(types, ...values) {
return types.every((type, index) => {
if (values[index] === undefined) {
return type === 'undefined';
}
return typeof values[index] === type;
});
}
function safeAdd(a, b) {
if (typeCheck(['number', 'number'], a, b)) {
return a + b;
} else {
throw new Error('引数は両方とも数値である必要があります');
}
}
console.log(safeAdd(5, 3)); // 8
try {
safeAdd(5, "3");
} catch (e) {
console.log(e.message); // 引数は両方とも数値である必要があります
}
こんな風に、型安全な関数を作ることもできるんです。
可変長引数関数でのundefined判定は、柔軟で強力なコードを書くのに役立ちます。最初は難しく感じるかもしれませんが、使っているうちに自然と身についていきますよ。ぜひ、自分のコードで試してみてくださいね!
undefinedとnullの適切な使い分け:コードの可読性と保守性を高める設計方針
さて、ここまでundefinedについて詳しく見てきましたが、よく混同されるのがnullとの違いです。この二つ、似ているようで実は全然違うんです。適切に使い分けることで、コードの可読性と保守性が大きく向上しますよ。
まず、基本的な違いを整理しましょう:
- undefined: 変数が宣言されているが、値が割り当てられていない状態を表します。
- null: 意図的に「値がない」ことを表現するために使います。
具体的に見ていきましょう:
let myVar;
console.log(myVar); // undefined
let myNullVar = null;
console.log(myNullVar); // null
myVarは宣言だけされているので自動的にundefinedになります。一方、myNullVarは意図的にnullを代入しています。
これらをどう使い分けるべきでしょうか?ここに一つの指針があります:
- undefinedは「まだ値が設定されていない」状態を表すのに使う
- nullは「意図的に値が存在しない」ことを表すのに使う
例えば、ユーザー情報を扱う場合を考えてみましょう:
let user = {
name: "太郎",
age: 30,
email: null,
phone: undefined
};
この場合、emailがnullなのは「ユーザーがメールアドレスを持っていない」ことを意味します。一方、phoneがundefinedなのは「電話番号情報がまだ設定されていない」ことを表しています。
関数の戻り値でも、この使い分けは有効です:
function findUser(id) {
// ユーザーが見つからなかった場合
return null;
}
function getUserEmail(user) {
// ユーザーがメールアドレスを持っていない場合
return user.email || null;
}
let user = findUser(123);
if (user === null) {
console.log("ユーザーが見つかりません");
} else {
let email = getUserEmail(user);
if (email === null) {
console.log("メールアドレスが設定されていません");
} else {
console.log(`メールアドレス: ${email}`);
}
}
このように使い分けることで、コードの意図がより明確になります。
また、オブジェクトのプロパティを削除する場合も、nullとundefinedで異なる挙動になります:
let obj = { x: 10, y: 20 };
obj.x = undefined;
console.log(obj); // { x: undefined, y: 20 }
console.log('x' in obj); // true
obj.y = null;
console.log(obj); // { x: undefined, y: null }
console.log('y' in obj); // true
delete obj.x;
console.log(obj); // { y: null }
console.log('x' in obj); // false
undefinedを代入しても、nullを代入しても、プロパティ自体は残ります。プロパティを完全に削除したい場合は、deleteを使う必要があります。
結局のところ、undefinedとnullの適切な使い分けは、コードの意図を明確に伝えるための重要なテクニックです。チーム開発では特に、この使い分けのルールを決めておくと、コードの可読性が大きく向上しますよ。
最初は少し面倒に感じるかもしれませんが、こういった細かい配慮が、長期的には保守性の高い、質の良いコードにつながるんです。ぜひ、日々のコーディングで意識してみてくださいね!
TypeScriptを用いたundefined判定の改善:静的型チェックによるエラー防止策
最後に、TypeScriptを使ったundefined判定の改善について触れておきましょう。TypeScriptって聞いたことありますか?JavaScriptに型システムを追加した言語なんです。これを使うと、undefinedに関するエラーをもっと早い段階で、しかも効率的に防げるんですよ。
TypeScriptの基本的な使い方は、こんな感じです:
let name: string = "太郎";
let age: number = 30;
let isStudent: boolean = false;
変数名の後に:型
をつけるだけで、その変数の型を指定できます。
undefinedの判定に関しては、TypeScriptならこんなことができます:
- Union型を使って、undefinedの可能性を明示的に示す
function getName(id: number): string | undefined {
// idに対応する名前が見つからない場合はundefinedを返す
// ...
}
let name = getName(123);
if (name === undefined) {
console.log("名前が見つかりません");
} else {
console.log(`名前: ${name}`);
}
これなら、getName関数がundefinedを返す可能性があることが一目でわかりますね。
- オプショナルパラメータを使って、引数が渡されない可能性を示す
function greet(name?: string) {
if (name === undefined) {
console.log("こんにちは、名無しさん!");
} else {
console.log(`こんにちは、${name}さん!`);
}
}
greet(); // "こんにちは、名無しさん!"
greet("太郎"); // "こんにちは、太郎さん!"
?
をつけるだけで、その引数がオプショナルであることを示せます。
- Non-null Assertion Operatorを使って、nullやundefinedでないことを明示する
function processUser(user: User | null | undefined) {
// userが絶対にnullやundefinedでないことがわかっている場合
const name = user!.name;
console.log(`ユーザー名: ${name}`);
}
!
をつけることで、「この値は絶対にnullやundefinedじゃないよ」とTypeScriptに教えることができます。ただし、これは本当に確信がある場合にのみ使うべきですね。
- 型ガードを使って、より安全にundefinedをチェックする
function processValue(value: string | undefined) {
if (typeof value === "string") {
console.log(value.toUpperCase());
} else {
console.log("値が設定されていません");
}
}
このように型をチェックすることで、その後の処理でTypeScriptが自動的に型を認識してくれます。
TypeScriptを使うことで、コンパイル時に多くのundefined関連のエラーを事前に発見できます。これは特に大規模なプロジェクトで威力を発揮しますよ。
let user: { name: string, age: number };
console.log(user.name); // コンパイルエラー: userが初期化されていません
普通のJavaScriptだと実行時エラーになる上記のようなコードも、TypeScriptならコンパイル時に気づけるんです。
結局のところ、TypeScriptを使うことで、undefinedに関する多くの問題を未然に防ぐことができます。型安全性が高まるだけでなく、IDEのサポートも充実するので、開発効率も上がりますよ。
最初は学習コストがかかるかもしれませんが、長期的に見ればそれ以上のメリットがあります。特に大規模なプロジェクトや、チーム開発では本当に役立つツールです。ぜひ、検討してみてくださいね!
undefinedの基本から応用まで、幅広くカバーしましたが、いかがでしたか?最初は難しく感じる部分もあったかもしれませんが、これらの知識を身につけることで、より堅牢で信頼性の高いJavaScriptコードが書けるようになります。ぜひ、実際のコーディングで活用してみてくださいね。頑張ってください!